Подтвердить что ты не робот

С++ можно ли перегрузить унарный минус-оператор ссылки rvalue?

Можно ли различать эти два метода? не следует ли мутировать значение 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
4b9b3361

Ответ 1

Вы можете использовать reference qualifier-s (или 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);
}

выходы:

&
&&

Ответ 2

Что-то вроде:

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

Демо