Почему этот вызов rvalue неоднозначен?

Почему этот вызов rvalue неоднозначен? У меня могут быть AA и AA &, и компилятор будет знать, что использовать AA & . Но когда я добавляю третий вариант, я получаю сообщение об ошибке. Очевидно, что 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());
}
7
задан GManNickG 8 April 2011 в 05:49
поделиться