Сообщение Re[6]: Про красивость работы с std::vector от 15.03.2025 9:10
Изменено 15.03.2025 9:16 rg45
Re[6]: Про красивость работы с std::vector
Здравствуйте, T4r4sB, Вы писали:
S>>
S>>А вот так если записать?
TB>Тогда будет RVO
TB>Но этот код эквивалентен
TB>
Не будет здесь никакого RVO, ни в том, ни в другом варианте. Чтобы был RVO, нужно, чтоб выражение под return должно относиться к категории prvalue и тип этого выражения должен совпадать с типом возращаемого значения функции. Здесь нарушены оба условия.
А в этих же обоих вариантах просто возврат rvalue ссылки, вот и всё. Здесь нельзя даже сказать, будет ли выполнено перемещение этого вектора, т.к. это завист от того, как будет использована эта ссылка вызывающей стороной.
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, нужно, чтоб выражение под return должно относиться к категории prvalue и тип этого выражения должен совпадать с типом возращаемого значения функции. Здесь нарушены оба условия.
А в этих же обоих вариантах просто возврат rvalue ссылки, вот и всё. Здесь нельзя даже сказать, будет ли выполнено перемещение этого вектора, т.к. это завист от того, как будет использована эта ссылка вызывающей стороной.
Re[6]: Про красивость работы с std::vector
Здравствуйте, T4r4sB, Вы писали:
S>>
S>>А вот так если записать?
TB>Тогда будет RVO
TB>Но этот код эквивалентен
TB>
Не будет здесь никакого RVO. Чтобы был RVO, нужно, чтоб выражение под return относилось к категории prvalue и тип этого выражения должен совпадать с типом возращаемого значения функции. Выражение std::move(data) принадлежит к категори xvalue. Вариат же, предложенный Shmj и вовсе не скомпилируется, поскольку выражение temp относится к категории lvalue и не может быть связано с rvalue сылкой.
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, нужно, чтоб выражение под return относилось к категории prvalue и тип этого выражения должен совпадать с типом возращаемого значения функции. Выражение std::move(data) принадлежит к категори xvalue. Вариат же, предложенный Shmj и вовсе не скомпилируется, поскольку выражение temp относится к категории lvalue и не может быть связано с rvalue сылкой.