検索

ホームページ  >  に質問  >  本文

c++ - 重载二义性问题

void f(void*)
{
    cout << 1;
}

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

int main()
{
    
    f(0);

    return 0;
}

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

PHPzPHPz2804日前869

全員に返信(1)返信します

  • 黄舟

    黄舟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 で特別に使用されます。

    返事
    0
  • キャンセル返事