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
.
以下代码无法编译。 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()
tovoid f(A& a)
.
根据参数的值类别更改函数签名是一项重大更改,可能需要手动检查该函数的每次调用。您不会找到神奇地适应这种变化的 C++ 习语。
"fix" g(std::move(a))
是保持函数参数右值性的正确方法。如果 g
应该对右值进行操作,请坚持使用它。如果你后来决定 g
接受右值没有意义,但你想传递一个左值,重构它 - 并调整调用。在这种特殊情况下,编译器会帮助您,因为它拒绝将右值绑定到函数参数 A& a
.