8

この右辺値呼び出しがあいまいなのはなぜですか? 私は AA と AA& を持つことができ、コンパイラは を使用することを認識しますAA&。しかし、3 番目のオプションを追加すると、エラーが発生します。明らかに AA&& は、int の int のような他のものよりも優れたオーバーロードであり、long よりも優れています。なぜこれがあいまいなのですか?3 つのオーバーロードすべてを保持し、どれが必要かを明確にする方法はありますか? (型キャスト(AA&&)はそれを行いません)。

struct AA{
    void*this_;
    AA() { this_=this; }
    //not valid, use AA&, AA(AA a){ this_=this; }
    AA(AA&a){ this_=this; }
    AA(AA&&a){ this_=a.this_; }
};
void movetest(AA s) {}
void movetest(AA& s) {}
//This gets me the ambiguous error void movetest(AA&& s) {}
AA&& movetest() { return AA(); }
void MyTestCode2(){
    AA a;
    AA b(a);
    AA c = movetest();
    movetest(AA());
}
4

2 に答える 2

8

私は AA と AA& を持つことができ、コンパイラーは AA& を使用することを認識します

はい、movetest(AA());の場合です。非 const への (左辺値) 参照は右辺値にバインドできないため、movetest(AA)のみが実行可能です。ただし、右辺値参照は一時に直接バインドされると言われています。したがって、オーバーロード解決の目的で、関数

void movetest(AA)
void movetest(AA&&)

AA()AAおよびAA&&にそれぞれ変換するために使用される暗黙的な変換シーケンスが等しいため、等しいです。直接参照バインディングも ID 変換と見なされるため、前者の方が適切ではありません。

于 2011-04-08T06:41:36.843 に答える
2

decltype に同意します。これは、この C++03/98 のあいまいさと何ら変わりはありません。

struct AA {};

void movetest(AA s) {}
void movetest(AA& s) {}

int main()
{
    AA a;
    movetest(a);
}

test.cpp:9:5: error: call to 'movetest' is ambiguous
    movetest(a);
    ^~~~~~~~
test.cpp:3:6: note: candidate function
void movetest(AA s) {}
     ^
test.cpp:4:6: note: candidate function
void movetest(AA& s) {}
     ^
1 error generated.
于 2011-04-08T15:30:36.800 に答える