cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
89 stars 0 forks source link

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

Open apolukhin opened 3 years ago

apolukhin commented 3 years ago

Перенос предложения: голоса +10, -0 Автор идеи: Mikhail Trishchenkov

Нужен метод у std::optional, который возвращает по значению текущее содержимое, оставляя optional пустым.

Очень часто требуется забрать значение из 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());
apolukhin commented 3 years ago

Yuriy Chernyshov, 13 декабря 2018, 18:59 Тогда нужно и для std::variant такой же метод добавить.

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

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

Andrey Davydov, 13 декабря 2018, 22:45 Идея классная, возможно стоит сделать этому методу ref-qualifier &&.

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

apolukhin commented 3 years ago

Нужно побольше мотивации для предложения. Возможно стоит написать автору https://wg21.link/p0798 и добавить метод в рамках p0798