void f(void*)
{
cout << 1;
}
void f(int)
{
cout << 2;
}
int main()
{
f(0);
return 0;
}
上述代码在C++编译器中是否会报二义性,我的vs2015没有,是不是跟编译器有关?
黄舟2017-04-17 15:39:14
関数呼び出しステートメントの場合、関数の一致はコンパイル時に検索されます。関数の一致には、最良一致、一致なし、およびあいまい一致の 3 つの結果があります。
上記のコードでは、f(0) は最も一致する f(int) を見つけますが、あいまいな一致エラーは表示されません。
gcc では、f(NULL) はあいまいなマッチング エラーを報告します。NULL は __null として定義されており、void* へのパスは int へのパスと同じ長さであるため、Windows ではあいまいなマッチング、NULL と見なされます。は直接 0 であるため、エラーは報告されません。これにより、テンプレートが再ロードされるときに、
などの特に奇妙な現象が発生します。 リーリーf(0) に最もよく一致するのは f(int) であるため、f(int) 関数を定義し、オーバーロードされた関数 f(void) も定義した場合は、f(void) を呼び出します。正しいアプローチは f(nullptr) です。nullptr は、この問題を解決するために C++11 で特別に使用されます。