以下代码无法编译。 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)
会发生什么情况。
有更好的成语吗?
答案 0 :(得分:5)
但对我却看错了:想想如果有人将
f()
的签名修改为void f(A& a)
会发生什么情况。
相对于参数的值类别更改函数签名是一项重大更改,可能需要手动检查该函数的每次调用。您不会找到神奇地适应这种变化的C ++习惯用法。
“ fix” g(std::move(a))
是保留函数参数正确性的正确方法。如果g
应该在右值上进行操作,请坚持使用。如果您以后认为g
接受右值没有意义,但是您想传递一个左值,则对其进行重构-并调整调用。在这种情况下,编译器将拒绝将右值绑定到函数参数A& a
。