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