C ++习惯用法:如何将右值作为右值传递?

时间:2019-09-17 09:12:47

标签: c++ c++11 reference rvalue

以下代码无法编译。 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)会发生什么情况。

有更好的成语吗?

1 个答案:

答案 0 :(得分:5)

  

但对我却看错了:想想如果有人将f()的签名修改为void f(A& a)会发生什么情况。

相对于参数的值类别更改函数签名是一项重大更改,可能需要手动检查该函数的每次调用。您不会找到神奇地适应这种变化的C ++习惯用法。

“ fix” g(std::move(a))是保留函数参数正确性的正确方法。如果g应该在右值上进行操作,请坚持使用。如果您以后认为g接受右值没有意义,但是您想传递一个左值,则对其进行重构-并调整调用。在这种情况下,编译器将拒绝将右值绑定到函数参数A& a