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专门用来解决这个问题的。