void f(void*) { cout << 1; } void f(int) { cout << 2; } int main() { f(0); return 0; }
上述代码在C++编译器中是否会报二义性,我的vs2015没有,是不是跟编译器有关?
学习是最好的投资!
関数呼び出しステートメントの場合、関数の一致はコンパイル時に検索されます。関数の一致には、最良一致、一致なし、およびあいまい一致の 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 で特別に使用されます。
関数呼び出しステートメントの場合、関数の一致はコンパイル時に検索されます。関数の一致には、最良一致、一致なし、およびあいまい一致の 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 で特別に使用されます。