Как без лишнего копирования обернуть вектор в optional и вернуть из функции? С++
Предположим есть какая-то такая функция:
std::optional<std::vector<MyType>> foo(AnyType any_argument) {
std::vector<MyType> vec;
/*do something*/
if (false_statement) {
return std::nullopt;
} else {
return ????????;
}
}
В данном случае функция возвращает опшионал с вектором, либо, если что-то идет не так, пустой опшионал. Вектор формируется внутри самой функции в зависимости от аргументов. Как его правильно возвращать в данном случае? Если просто написать return { vec };, то по идее создастся опшионал с другим вектором и вектор из функции будет скопирован в вектор в опшионале. На данный момент я пишу return { std::move(vec) };, но мне не кажется это правильным вариантом. Есть ли другие способы вернуть этот вектор без лишнего копирования?
Ответы (3 шт):
Достаточно написать
return std::make_optional<std::vector<MyType>>(std::move(vec))
return { std::move(vec) }; (или return std::move(vec);) кажется нормальным вариантом.
Еще можно изменить тип переменной vec на optional, и делать просто return vec;.
Перемещение вектора в возвращаемый опциональный объект - это, конечно, хорошо. Но по исходному коду меня смущает тот момент, что вектор создаётся и заполняется, несмотря на то, что в конечном итоге по условию он может быть просто отброшен в ветке, где возвращается nullopt.
Если создание и заполнение вектора можно отложить до момента, когда точно ясно, что его придётся вернуть, то искомая строка может выглядеть как-то так:
return {{el1, el2, el3}};
Где elN - элементы итогового вектора. В этом случае не будет даже перемещения вектора, он сразу создастся внутри возвращаемого optional.