(С ++23 неявное перемещение) Возврат перемещенной переменной локального хранилища как rvalue ref только с круглыми скобками?
https://isocpp.org/files/papers/P2266R1.html
P2266R1
Simpler implicit move
Published Proposal, 2021-03-13
Arthur O'Dwyer
Я не уверен, правильно ли я понимаю эти новые «допустимые к перемещению» вещи.
Исправьте эти пункты, если они неверны:
[LIVE]
-
std::forward
становится необязательным для идеальной пересылки полученного rvalue ref
template<class T>
T&& seven(T&& x) { return std::forward<T&&>(x); }
становится
template<class T>
T&& seven(T&& x) { return x; }
- стать необязательным для rvalue ref, созданного локально
Widget&&
test_seven(Widget w) {
[[maybe_unused]] Widget&& rr = seven(std::move(w));
return std::move(rr);
}
становится
Widget&&
test_seven(Widget w) {
[[maybe_unused]] Widget&& rr = seven(std::move(w));
return rr;
}
-
std::move
необязательно становитсяparenthesis only
для возврата rvalue ref для вещей, созданных локально.
Widget&& h3(Widget t) {
return std::move(t);
}
становится
Widget&& h3(Widget t) {
return (t);
}
Примечание: (3): clang trunk предупреждает о возврате адреса локального стека во время публикации этого сообщения.
1 ответ
Все три пункта верны. Во всех случаях рассматриваемая переменная является неявно перемещаемым объектом (кроме
seven
если создается с lvalue) и, таким образом, рассматривается как xvalue.
Круглые скобки здесь:
Widget&& h3(Widget t) {
return (t);
}
на самом деле ничего не делай. Они бы сделали, если бы функция вернула
decltype(auto)
- с тех пор без скобок функция возвращала
Widget
(но все равно двигаться
t
, а не копировать).