【问题标题】:Passing rvalue references between functions在函数之间传递右值引用
【发布时间】:2018-11-17 02:02:34
【问题描述】:

我正在为特定类 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 &amp; 来解决这个问题,但出于设计目的,右值引用会更有意义(foo 是一个嵌套的帮助类,不应该在基类定义之外实例化) .

【问题讨论】:

  • 我理解它移动论点的方式撕裂了原作的胆量。如果您不想再次使用您正在比较的对象,这没关系。如果您稍后再次使用它们,这将属于未定义行为类。

标签: c++ operator-overloading rvalue-reference


【解决方案1】:

表达式lhsrhsbool operator!=(foo&amp;&amp; lhs, foo&amp;&amp; rhs){ 中的左值表达式。这与变量的引用类型无关。

正如消息所说,左值不能绑定到右值引用,因此不能考虑重载 bool operator==(foo&amp;&amp; lhs, foo&amp;&amp; rhs){

如果你想从一个左值中获取一个右值,以便它可以绑定到右值引用,你应该使用std::move

bool operator!=(foo&& lhs, foo&& rhs){
    return operator==(std::move(lhs), std::move(rhs));
}

【讨论】:

  • 另外,operator!= 需要返回 operator== 返回的 相反return !operator==(...); 如果两个对象相等,它们也不能不相等。
猜你喜欢
  • 2021-02-24
  • 1970-01-01
  • 1970-01-01
  • 2012-07-05
  • 1970-01-01
  • 2014-09-09
  • 2011-01-30
  • 1970-01-01
相关资源
最近更新 更多