Информация об изменениях

Сообщение Re[6]: Про красивость работы с std::vector от 15.03.2025 9:10

Изменено 15.03.2025 10:01 rg45

Re[6]: Про красивость работы с std::vector
Здравствуйте, T4r4sB, Вы писали:

S>>
S>>std::vector<uint8_t>&& takeData()
S>>{
S>>    std::vector<uint8_t>&& temp = std::move(data); // temp - rvalue-ссылка на data
S>>    return temp;
S>>}
S>>


S>>А вот так если записать?


TB>Тогда будет RVO

TB>Но этот код эквивалентен

TB>
TB>return std::move(data)
TB>


Не будет здесь никакого RVO. Чтобы был RVO (aka guaranteed copy elision), нужно, чтоб выражение под return относилось к категории prvalue и тип этого выражения должен совпадать с типом возращаемого значения функции. Выражение std::move(data) принадлежит к категори xvalue. Вариат же, предложенный Shmj и вовсе не скомпилируется, поскольку выражение temp относится к категории lvalue и не может быть связано с rvalue сылкой.
Re[6]: Про красивость работы с std::vector
Здравствуйте, T4r4sB, Вы писали:

S>>
S>>std::vector<uint8_t>&& takeData()
S>>{
S>>    std::vector<uint8_t>&& temp = std::move(data); // temp - rvalue-ссылка на data
S>>    return temp;
S>>}
S>>


S>>А вот так если записать?


TB>Тогда будет RVO

TB>Но этот код эквивалентен

TB>
TB>return std::move(data)
TB>


Не будет здесь никакого RVO. Во втором варианте будет просто возврат rvalue ссылки и только. Причём, будет ли выполнено перемщение данных вектора, не известно — это зависит от того, каким образом вызывающая сторона использует полученную ссылку. Вариант же, предложенный Shmj и вовсе не скомпилируется, поскольку выражение temp относится к категории lvalue и не может быть связано с rvalue сылкой.

А чтобы был RVO (aka guaranteed copy elision), нужно, чтоб выражение под return относилось к категории prvalue и тип этого выражения должен совпадать с типом возращаемого значения функции. Выражение же std::move(data) принадлежит к категори xvalue.