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
是否可以區分這兩種方法? 如果在這種情況下看起來是完全可重用的,應該不會變異一個右值?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
可以使用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);
}
輸出:
&
&&
是這樣的:
class Type
{
public:
Type& operator -() && { std::cout << "rvalue\n"; return *this; }
Type& operator -() & { std::cout << "lvalue\n"; return *this; }
};
'A'和'一個+ B'是*左值*和* prvalue *(如果TYPE是內置或它的操作者'+'由值返回);他們不是參考 –