gpt4 book ai didi

c++ - 为什么这个右值调用不明确?

转载 作者:可可西里 更新时间:2023-11-01 18:28:47 28 4
gpt4 key购买 nike

为什么这个右值调用不明确?我可以使用 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());
}

最佳答案

I can have AA and AA& and the compiler will know to use AA&

是的,在 movetest(AA()); 的情况下,只有 movetest(AA) 是可行的,因为对非常量的(左值)引用不能绑定(bind)到右值。但是,据说右值引用直接绑定(bind) 到临时对象。因此,出于重载决议的目的,函数

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

是相等的,因为隐式转换序列用于将AA()转换为AAAA&&,分别是相等的。前者并没有更好,因为直接引用绑定(bind)也算是一种身份转换。

关于c++ - 为什么这个右值调用不明确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5590849/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com