为什么这个左值调用不明确?

7 c++ rvalue ambiguous move-semantics c++11

为什么这个左值调用不明确?我可以有AA和AA&编译器将知道使用AA&.但是,当我添加第三个选项时,我得到一个错误.显然AA &&是一个更好的重载然后其他像int这样的int更好然后很长.为什么这个含糊不清?有没有办法我可以保持所有3个重载并明确我想要哪一个?(Typecasting (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());
}
Run Code Online (Sandbox Code Playgroud)

dec*_*ype 7

我可以有AA和AA&编译器会知道使用AA&

是的,在movetest(AA())的情况下; ,只有movetest(AA)是可行的,因为对非const的(左值)引用不能绑定到右值.但是,rvalue引用被称为直接绑定到临时引用.因此,用于过载解决目的的功能

void movetest(AA)
void movetest(AA&&)
Run Code Online (Sandbox Code Playgroud)

因为用于将AA()分别转换为AAAA &&隐式转换序列是相等的.前者并不是更好,因为直接引用绑定也被认为是身份转换.