2010-01-18 94 views
0

假設在指示的註釋中有一個正確的實例化,下面的表達式是合法的和可移植的C++?爲什麼或者爲什麼不?std :: mem_fun表達式的可移植性

std::mem_fun</*…*/>(&(std::vector<int>::clear)) 
+1

從Herb Sutter的書複製?第1部分,第4章從特殊的C++ - 47工程難題,編程問題和解決方案:) – coelhudo 2010-01-18 15:11:38

+0

@ coelhudo:可能來自那本書,但有人問我這個,我無法回答。所以想到在這裏問。沒有冒犯的意思 :-) – 2010-01-19 01:19:59

回答

3

正如它所寫的,帶有一組空白的模板參數,沒有。你需要給出正確的參數,或者把它們全部留出,以便從參數中推斷出來。

因此,這是合法的:

std::mem_fun(&std::vector<int>::clear) 

,所以是這樣的:

std::mem_fun<void,std::vector<int> >(&std::vector<int>::clear) 

兩個給一個函數對象與函數調用操作,需要一個指針,std::vector<int>並在其上調用clear

編輯:作爲UncleBens提到,周圍的函數名的括號實際上是違法的,所以我從我的答案刪除它們。

1

這是完全合法和便攜。只記得在不同的平臺/編譯器中int可能是不同的大小。另外,顯式參數版本很少使用,讓編譯器自己推導出類型。

0

號:

"ComeauTest.c", line 7: error: nonstandard form for taking the address of a member 
      function 
     std::mem_fun(&(std::vector<int>::clear)); 
       ^

刪除多餘的括號。

總的來說,我認爲std::mem_fun的唯一目的是爲了推斷模板參數爲你選擇使用mem_fun_tmem_fun1_tconst_mem_fun_tconst_mem_fun1_t,所以目前還不清楚爲什麼你曾經想爲mem_fun明確指定模板參數。但是,與其他任何函數模板一樣,它自然是允許的。

0

簡答:「一些流行的編譯器號」 (來自Exceptional C++)(我會假設他在談論GCC或Microsoft C++編譯器)。

長答案詳述here。我不知道當前編譯器版本的答案是否仍然有效,因爲這篇文章是在2004年出版的。

我強烈建議你閱讀本週的大師(gotw.ca),那裏有很多有趣/有趣/好奇的東西。