С++ 11 - ссылочные переменные rvalue

В чем разница между

int a = 42;

и

int&& rvr = 42;

?

a, очевидно, является lvalue, но rvr также является lvalue, так как это именованная переменная, поэтому эти выражения можно считать в точности эквивалентными, а если нет, то в каких сценариях int&& объявление предпочтительнее?

Ответы

Ответ 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 также даст разные результаты для ссылок.