Składnia dla odniesień uniwersalnych
To jest referencja rvalue:
void foo(int&& a);
Nie wiąże się z lwartościami:
int i = 42;
foo(i); // error
To jest uniwersalne odniesienie:
template<typename T>
void bar(T&& b);
Wiąże się z wartościami rval, a także wiąże się z wartościami:
bar(i); // okay
To jest referencja rvalue:
template<typename T>
struct X
{
void baz(T&& c);
};
Nie wiąże się z lwartościami:
X<int> x;
x.baz(i); // error
Dlaczego odniesienia uniwersalne używają tej samej składni, co odwołania do wartości? Czy to nie jest niepotrzebne źródło zamieszania? Czy komisja kiedykolwiek rozważała takie alternatywne składnieT&&&
, T&*
, T@
lubT&42
(tylko żartuję z tego ostatniego)? Jeśli tak, jakie były przyczyny odrzucenia alternatywnych składni?