Ответ 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);
}
выходы:
&
&&