假設在指示的註釋中有一個正確的實例化,下面的表達式是合法的和可移植的C++?爲什麼或者爲什麼不?std :: mem_fun表達式的可移植性
std::mem_fun</*…*/>(&(std::vector<int>::clear))
假設在指示的註釋中有一個正確的實例化,下面的表達式是合法的和可移植的C++?爲什麼或者爲什麼不?std :: mem_fun表達式的可移植性
std::mem_fun</*…*/>(&(std::vector<int>::clear))
正如它所寫的,帶有一組空白的模板參數,沒有。你需要給出正確的參數,或者把它們全部留出,以便從參數中推斷出來。
因此,這是合法的:
std::mem_fun(&std::vector<int>::clear)
,所以是這樣的:
std::mem_fun<void,std::vector<int> >(&std::vector<int>::clear)
兩個給一個函數對象與函數調用操作,需要一個指針,std::vector<int>
並在其上調用clear
。
編輯:作爲UncleBens提到,周圍的函數名的括號實際上是違法的,所以我從我的答案刪除它們。
這是完全合法和便攜。只記得在不同的平臺/編譯器中int可能是不同的大小。另外,顯式參數版本很少使用,讓編譯器自己推導出類型。
號:
"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_t
,mem_fun1_t
,const_mem_fun_t
或const_mem_fun1_t
,所以目前還不清楚爲什麼你曾經想爲mem_fun
明確指定模板參數。但是,與其他任何函數模板一樣,它自然是允許的。
簡答:「一些流行的編譯器號」 (來自Exceptional C++)(我會假設他在談論GCC或Microsoft C++編譯器)。
長答案詳述here。我不知道當前編譯器版本的答案是否仍然有效,因爲這篇文章是在2004年出版的。
我強烈建議你閱讀本週的大師(gotw.ca),那裏有很多有趣/有趣/好奇的東西。
從Herb Sutter的書複製?第1部分,第4章從特殊的C++ - 47工程難題,編程問題和解決方案:) – coelhudo 2010-01-18 15:11:38
@ coelhudo:可能來自那本書,但有人問我這個,我無法回答。所以想到在這裏問。沒有冒犯的意思 :-) – 2010-01-19 01:19:59