Ответ 1
Они не совсем эквивалентны. Вы правы, что обе переменные являются lvalues, но для большинства типов инициализация формы
T a = b;
создает временный объект T
, а затем создает a
из этого временного объекта. Этот временный объект может быть удален, но он по-прежнему требует наличия соответствующих конструкторов.
T &&a = b;
с другой стороны, привязывает a
непосредственно к b
, но требует b
для значения r. Итак:
int a = 3;
// int&&b = a; // error: && cannot bind to lvalues
int b = a; // okay
struct S { S(const S &) = delete; };
S f();
// S s = f(); // error: no copy or move constructor available
S&&s = f(); // okay
И проще говоря, decltype
также даст разные результаты для ссылок.