C++:是否可以重载右值引用的一元减运算符?

14

有可能区分这两种方法吗? 在这种情况下,当看起来完全可重用时,是否不应该改变rvalue?

TYPE a;
TYPE b = -a;      // unary operator- of a TYPE& aka lvalue ref
TYPE c = -(a+b);  // unary operator- of a TYPE&& aka rvalue ref

aa+blvalueprvalue(如果TYPE是内置类型或其operator+返回值);它们不是引用。 - M.M
2个回答

15
你可以使用参考限定符(或标准中的ref-qualifiers)来实现。

http://coliru.stacked-crooked.com/a/40905649dc0c14e7

例子:
#include <iostream>
#include <string>
#include <vector>

class X
{
   public:
      int n;
      X(const X&) = default;
      X() : n(0) {}
      X(int n) : n(n) {}

      X operator- () const &  // lvalue ref-qualifier
      {
         std::cout << "&\n";
         X x(-n);
         return x;
      }

      X operator- () const && // rvalue ref-qualifier
      {
         std::cout << "&&\n";
         X x(-n);
         return x;
      }    

      friend X operator+(const X& lhs, const X& rhs) {
          return X(lhs.n + rhs.n);
      }
};

int main()
{
    X a;
    X b = -a;      // unary operator- of a TYPE& aka lvalue ref
    X c = -(a+b);
}

输出:
&
&&

12

类似于:

class Type
{
public:
    Type& operator -() && { std::cout << "rvalue\n";  return *this; }
    Type& operator -() & { std::cout << "lvalue\n";  return *this; }
};

演示


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接