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