Как без лишнего копирования обернуть вектор в 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 шт):

Автор решения: magrif

Достаточно написать

return std::make_optional<std::vector<MyType>>(std::move(vec))
→ Ссылка
Автор решения: HolyBlackCat

return { std::move(vec) }; (или return std::move(vec);) кажется нормальным вариантом.

Еще можно изменить тип переменной vec на optional, и делать просто return vec;.

→ Ссылка
Автор решения: αλεχολυτ

Перемещение вектора в возвращаемый опциональный объект - это, конечно, хорошо. Но по исходному коду меня смущает тот момент, что вектор создаётся и заполняется, несмотря на то, что в конечном итоге по условию он может быть просто отброшен в ветке, где возвращается nullopt.

Если создание и заполнение вектора можно отложить до момента, когда точно ясно, что его придётся вернуть, то искомая строка может выглядеть как-то так:

return {{el1, el2, el3}}; 

Где elN - элементы итогового вектора. В этом случае не будет даже перемещения вектора, он сразу создастся внутри возвращаемого optional.

→ Ссылка