2016-06-09 71 views
13

是否可以區分這兩種方法? 如果在這種情況下看起來是完全可重用的,應該不會變異一個右值?C++是否可以重載右值引用的一元減運算符?

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 *(如果TYPE是內置或它的操作者'+'由值返回);他們不是參考 –

回答

14

可以使用reference qualifier-s(或ref-限定符作爲標準)

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