下面的代码没有编译。Clang给出了以下错误消息:candidate function not viable: no known conversion from 'A' to 'A &&' for 1st argument
这就好像a在f()中是一个值。
struct A{};
void g(A&& a){
return;
}
void f(A&& a){
g(a);
}
int main(){
return 0;
}这是合理的,因为防止f()多次调用g()。
下面将修复我的代码:
g(std::move(a)); 但我看错了:想想如果有人将f()的签名修改为void f(A& a)会发生什么。
有更好的成语吗?
发布于 2019-09-17 09:20:37
但是看错了我:想想如果有人将
f()的签名修改为void f(A& a)会发生什么。
更改与参数的值类别有关的函数签名是一项重大更改,可能需要手动检查该函数的每次调用。您将找不到一个神奇地适应这种变化的C++成语。
"fix“g(std::move(a))是保持函数参数的rvalueness的正确方法。如果g应该对rvalue进行操作,请继续使用它。如果您后来决定g接受一个rvalue是没有意义的,但是您想要传递一个lvalue,那么重构它-并调整调用。在这种情况下,编译器将帮助您拒绝将rvalue绑定到函数参数A& a。
https://stackoverflow.com/questions/57971034
复制相似问题