13

Можно ли различить эти два метода? Должен ли один из них не изменять значение rvalue, когда в этом случае кажется совершенно многоразовым?C++ можно перегрузить унарный оператор минус ссылки 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 
+0

'' A' и а + b' является * именующая * и * prvalue * (если ТИП встроенный или его '' оператора + возвращает по значению); они не ссылки –

ответ

14

Вы можете использовать reference qualifier-s (или реф-определители, как в стандарте)

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); 
} 

выходов:

& 
&& 
11

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

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

Demo

Смежные вопросы