C++ 习语:右值如何作为右值传递?

C++ Idioms: How can an rvalue be passed around as rvalue?

以下代码无法编译。 Clang 给出此错误消息: candidate function not viable: no known conversion from 'A' to 'A &&' for 1st argument

这就好像 f() 中的 a 是一个左值。

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).

会发生什么

还有更好的成语吗?

but looks wrong at me: think what happens if someone modifies the signature of f() to void f(A& a).

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

"fix" g(std::move(a)) 是保持函数参数右值性的正确方法。如果 g 应该对右值进行操作,请坚持使用它。如果你后来决定 g 接受右值没有意义,但你想传递一个左值,重构它 - 并调整调用。在这种特殊情况下,编译器会帮助您,因为它拒绝将右值绑定到函数参数 A& a.