84669 orang belajar
152542 orang belajar
20005 orang belajar
5487 orang belajar
7821 orang belajar
359900 orang belajar
3350 orang belajar
180660 orang belajar
48569 orang belajar
18603 orang belajar
40936 orang belajar
1549 orang belajar
1183 orang belajar
32909 orang belajar
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专门用来解决这个问题的。