Это ссылка на rvalue:
void foo(int&& a);
Он не привязывается к lvalues:
int i = 42;
foo(i); // error
Это универсальная ссылка:
template<typename T>
void bar(T&& b);
Он связывается с rvalues, а также привязывается к lvalues:
bar(i); // okay
Это ссылка на rvalue:
template<typename T>
struct X
{
void baz(T&& c);
};
Он не привязывается к lvalues:
X<int> x;
x.baz(i); // error
Почему универсальные ссылки используют тот же синтаксис, что и ссылки rvalue? Разве это не лишний источник путаницы? Был ли комитет когда-либо рассматривал альтернативные синтаксисы, такие как T&&&
, T&*
, [email protected]
или T&42
(просто шутите на последнем)? Если да, то в чем причины отказа от альтернативных синтаксисов?