Ответ 1
Код правильный. auto&& p = expr
означает, что тип p
равен T&&
, где T
будет выведено из expr
. Здесь &&
указывает ссылку на rvalue, например,
auto&& p = 1;
выведет T == int
, и, следовательно, тип p
будет int&&
.
Однако ссылки могут быть свернуты в соответствии с правилом:
T& & == T&
T& && == T&
T&& & == T&
T&& && == T&&
(Эта функция используется для реализации идеальной пересылки в С++ 11.)
В случае
auto&& p = x;
as x
является lvalue, ссылка rvalue не может быть привязана к нему, но если мы выберем T = int&
, тогда тип p
станет int& && = int&
, который является ссылкой на lvalue, которая может быть связана до x
. Только в этом случае auto&&
и auto&
дают тот же результат. Эти два отличаются друг от друга, например,
auto& p = std::move(x);
неверно, поскольку std::move(x)
является rvalue, а ссылка lvalue не может быть привязана к нему.
Прочитайте С++ Rvalue References Explained для прогулок.