3

次のコードで特定できたバグを見つけて修正するのに時間を費やす必要がありました。

#include <iostream>

struct A
{
    std::string S;
    A(const std::string s) { S = s; }
};

void f1(A a) { std::cout << "f1:a.S = " << a.S << "\n"; }
void f1(const std::string s) { std::cout << "f1:s = " << s << "\n"; }

void f2(A a) { std::cout << "f2:a.S = " << a.S << "\n"; }

int main()
{
    f1(A("test"));
    f1(std::string("test"));

    f2(A("test"));
    f2(std::string("test"));

    return 0;
}

このバグは、(私とコンパイラ(?)によって)見落とされていた -function によって作成されたあいまいさが原因f1でしf2f1(A):出力は次のとおりです。f1(std::string)A

f1:a.S = test
f1:s = test
f2:a.S = test
f2:a.S = test

この動作は正しいですか? コンパイラの問題?それとも普通の PIBCAK ですか?

4

1 に答える 1

8

あなたが説明する振る舞いは予想されます:曖昧さはありません。過負荷解決のあいまいさは、2つの過負荷が等しくよく一致し、両方が「最良の過負荷」である場合に発生します。

f1タイプの引数を使用して呼び出す場合A、最初の引数はf1完全一致です。2番目f1はまったく一致しません。したがって、f1明らかに過負荷の解決中に勝ちます。

f1タイプの引数を使用して呼び出すとstd::string、最初は;f1の変換コンストラクターを介して一致します。A2番目f1は完全一致です。2つ目f1は、より適切な一致です。完全に一致し、変換は必要ありません。2つのオーバーロードは等しく一致しないため、あいまいさはありません。過負荷の解決中に2番目f1が勝ちます。

于 2012-11-25T19:33:45.783 に答える