Неважно, используете ли вы std::move
или нет. Оптимизация возвращаемого значения здесь не будет. Существует несколько требований к RVO.
Одним из требований для оптимизации возвращаемого значения является то, что возвращаемое значение должно быть того же типа , что и возвращаемое значение. функция возвращает.
std::optional<std::vector<int>> getVectOr(int i)
Ваша функция возвращает std::optional<std::vector<int>>
, поэтому будет исключена только копия временного того же типа . В двух рассматриваемых здесь return
утверждениях оба временных значения std::vector<int>
, которые, конечно, не одного типа, поэтому RVO не происходит.
Независимо от того, что происходит, вы возвращение std::optional<std::vector<int>>
. Это абсолютное требование здесь. Без исключений. Но ваше приключение вернуть что-либо из этой функции всегда начинается с std::vector<int>
. Неважно, что вы пытаетесь, вы не можете превратить его в совершенно другой тип. Что-то придется строить где-то по пути. Оптимизация возвращаемого значения отсутствует.
Но, сказав, что здесь есть и семантика ходов, которые вступают в игру. Если звезды удачно выровнены для вас (и это очень вероятно), семантика перемещения позволит всему происходить без копирования содержимого большого вектора вокруг. Таким образом, хотя оптимизация возвращаемого значения не происходит, вы можете выиграть в лотерею, и у вас все получится, не перетасовывая фактическое содержимое вектора по всей вашей оперативной памяти. Вы можете сами использовать свой отладчик, чтобы подтвердить или опровергнуть, выиграли ли вы лотерею на этом счету.
У вас также может быть возможность другого типа RVO, а именно return
, если не изменяемый объект с автоматической областью видимости из функции:
std::optional<std::vector<int>> getVectOr(int i) {
std::optional<std::vector<int>> ret;
// Some code
return ret;
}
Здесь также возможна оптимизация возвращаемого значения, это необязательно, но не обязательно.