在函数之间传递右值引用

joa*_*dre 0 c++ operator-overloading rvalue-reference

我正在为特定类实现比较运算符重载foo

class foo{
public:
    foo() {};
};

bool operator==(foo&& lhs, foo&& rhs){
    // ...
    return true;
}
bool operator!=(foo&& lhs, foo&& rhs){
    return operator==(lhs,rhs);
}
Run Code Online (Sandbox Code Playgroud)

但是,在调用!=运算符时,出现以下编译错误:

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);
                        ^~~
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎很奇怪,因为 ==运算符重载将右值引用作为参数,那么编译器究竟为什么要尝试取消引用它们呢?

PS:我知道我可以通过将对象作为 传递来解决这个问题const &,但出于设计目的,右值引用会更有意义(foo是一个不应在基类定义之外实例化的嵌套帮助类)。

小智 5

表达式lhsrhs是 中的左值表达式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));
}
Run Code Online (Sandbox Code Playgroud)