84669 人學習
152542 人學習
20005 人學習
5487 人學習
7821 人學習
359900 人學習
3350 人學習
180660 人學習
48569 人學習
18603 人學習
40936 人學習
1549 人學習
1183 人學習
32909 人學習
void f(void*) { cout << 1; } void f(int) { cout << 2; } int main() { f(0); return 0; }
上述代码在C++编译器中是否会报二义性,我的vs2015没有,是不是跟编译器有关?
学习是最好的投资!
函數呼叫的語句,在編譯期間就會尋求函數匹配,函數匹配有三種結果:最佳匹配、無匹配、二義性匹配。
在上面的程式碼裡,f(0)會找出最佳匹配f(int),你看不到二義性匹配的錯誤。
在gcc下,f(NULL)會報二義性匹配錯誤,因為NULL被定義為__null,它轉到void*的路徑和轉到int的路勁一樣長,所以被認為是二義性匹配,windows下NULL直接就是0,所以不會報錯,這一點會在template重載的時候引起特別奇怪的現象,比如說
template<class F, class A> void test(F f, A a) { f(a); } void f(void*) { cout << 1; } test(f, NULL); //这里会报无匹配
由於f(0)最佳匹配是f(int),所以如果你定義了f(int)函數的同時又定義了f(void)這個重載函數,那麼調用f(void)的正確作法是f(nullptr),nullptr是c++11專門用來解決這個問題的。
函數呼叫的語句,在編譯期間就會尋求函數匹配,函數匹配有三種結果:最佳匹配、無匹配、二義性匹配。
在上面的程式碼裡,f(0)會找出最佳匹配f(int),你看不到二義性匹配的錯誤。
在gcc下,f(NULL)會報二義性匹配錯誤,因為NULL被定義為__null,它轉到void*的路徑和轉到int的路勁一樣長,所以被認為是二義性匹配,windows下NULL直接就是0,所以不會報錯,這一點會在template重載的時候引起特別奇怪的現象,比如說
由於f(0)最佳匹配是f(int),所以如果你定義了f(int)函數的同時又定義了f(void)這個重載函數,那麼調用f(void)的正確作法是f(nullptr),nullptr是c++11專門用來解決這個問題的。