Метод take, позволяющий извлечь значение из std::optional

Mikhail Trishchenkov
Mikhail Trishchenkov

Очень часто требуется забрать значение из optional, оставив его пустым. Но подходящего метода нет. *std::move(opt) хотя и перемещает значение, не делает optional пустым, внутри остаётся «мёртвое» значение. Хотелось бы чего-то такого:

template <T> T std::optional::take() { .. }

std::optional<int> opt_value(2);

int value = opt_value.take();

assert(value == 2);

assert(opt_value.empty());

9
рейтинг
4 комментария
Yuriy Chernyshov

Тогда нужно и для std::variant такой же метод добавить.

Хотя идеологически правильнее, конечно, изменить поведение в *std::move(opt)

Yuriy Chernyshov
nenomius

Yuriy Chernyshov, в каком состоянии тогда будет с std::variant после данной операции? valueless_by_move?

nenomius
Andrey Davydov

Идея классная, возможно стоит сделать этому методу ref-qualifier `&&`.

Andrey Davydov
Андрей Руссков

std::move не дает гарантий для moved-out значения, кроме валидного состояния (и эту гарантию ты должен обеспечивать сам). Поэтому в общем случае moved-out объекты лучше не использовать.

Андрей Руссков
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).
Все предложения