(С ++23 неявное перемещение) Возврат перемещенной переменной локального хранилища как rvalue ref только с круглыми скобками?

https://isocpp.org/files/papers/P2266R1.html

      P2266R1
Simpler implicit move
Published Proposal, 2021-03-13
Arthur O'Dwyer

Я не уверен, правильно ли я понимаю эти новые «допустимые к перемещению» вещи.
Исправьте эти пункты, если они неверны:
[LIVE]

  1. 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; }
  1. стать необязательным для 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;
}
  1. 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, а не копировать).

Другие вопросы по тегам