在函数之间传递右值引用
Passing rvalue references between functions
我正在为特定的 class foo
:
实现比较运算符重载
class foo{
public:
foo() {};
};
bool operator==(foo&& lhs, foo&& rhs){
// ...
return true;
}
bool operator!=(foo&& lhs, foo&& rhs){
return operator==(lhs,rhs);
}
但是,当调用 !=
运算符时,出现以下编译错误:
tester.cpp: In function ‘bool operator!=(foo&&, foo&&)’:
tester.cpp:37:27: error: no matching function for call to ‘operator==(foo&, foo&)’
return operator==(lhs,rhs);
^
tester.cpp:33:6: note: candidate: ‘bool operator==(foo&&, foo&&)’ <near match>
bool operator==(foo&& lhs, foo&& rhs){
^~~~~~~~
tester.cpp:33:6: note: conversion of argument 2 would be ill-formed:
tester.cpp:37:24: error: cannot bind rvalue reference of type ‘foo&&’ to lvalue of type ‘foo’
return operator==(lhs,rhs);
^~~
这对我来说似乎很奇怪,因为 ==
运算符重载将右值引用作为参数,那么为什么编译器要尝试取消引用它们呢?
PS:我知道我可以通过将对象作为 const &
传递来解决这个问题,但出于设计目的,右值引用会更有意义(foo
是一个嵌套的助手 class 不应在基础 class 定义之外实例化。
表达式lhs
和rhs
是bool operator!=(foo&& lhs, foo&& rhs){
中的左值表达式。这与变量的引用类型无关。
正如消息所说,左值不能绑定到右值引用,因此不能考虑重载 bool operator==(foo&& lhs, foo&& rhs){
。
如果你想从一个左值得到一个右值,所以它可以绑定到右值引用,你应该使用 std::move
:
bool operator!=(foo&& lhs, foo&& rhs){
return operator==(std::move(lhs), std::move(rhs));
}
我正在为特定的 class foo
:
class foo{
public:
foo() {};
};
bool operator==(foo&& lhs, foo&& rhs){
// ...
return true;
}
bool operator!=(foo&& lhs, foo&& rhs){
return operator==(lhs,rhs);
}
但是,当调用 !=
运算符时,出现以下编译错误:
tester.cpp: In function ‘bool operator!=(foo&&, foo&&)’:
tester.cpp:37:27: error: no matching function for call to ‘operator==(foo&, foo&)’
return operator==(lhs,rhs);
^
tester.cpp:33:6: note: candidate: ‘bool operator==(foo&&, foo&&)’ <near match>
bool operator==(foo&& lhs, foo&& rhs){
^~~~~~~~
tester.cpp:33:6: note: conversion of argument 2 would be ill-formed:
tester.cpp:37:24: error: cannot bind rvalue reference of type ‘foo&&’ to lvalue of type ‘foo’
return operator==(lhs,rhs);
^~~
这对我来说似乎很奇怪,因为 ==
运算符重载将右值引用作为参数,那么为什么编译器要尝试取消引用它们呢?
PS:我知道我可以通过将对象作为 const &
传递来解决这个问题,但出于设计目的,右值引用会更有意义(foo
是一个嵌套的助手 class 不应在基础 class 定义之外实例化。
表达式lhs
和rhs
是bool operator!=(foo&& lhs, foo&& rhs){
中的左值表达式。这与变量的引用类型无关。
正如消息所说,左值不能绑定到右值引用,因此不能考虑重载 bool operator==(foo&& lhs, foo&& rhs){
。
如果你想从一个左值得到一个右值,所以它可以绑定到右值引用,你应该使用 std::move
:
bool operator!=(foo&& lhs, foo&& rhs){
return operator==(std::move(lhs), std::move(rhs));
}