c++ - 重载二义性问题
PHPz
PHPz 2017-04-17 15:37:14
0
1
890
void f(void*)
{
    cout << 1;
}

void f(int)
{
    cout << 2;
}

int main()
{
    
    f(0);

    return 0;
}

上述代码在C++编译器中是否会报二义性,我的vs2015没有,是不是跟编译器有关?

PHPz
PHPz

学习是最好的投资!

全員に返信(1)
黄舟

関数呼び出しステートメントの場合、関数の一致はコンパイル時に検索されます。関数の一致には、最良一致、一致なし、およびあいまい一致の 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 で特別に使用されます。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート