Pull to refresh

Comments 10

Этот тип является типом-значением (value-type) (таким образом, вы можете копировать его).

только если параметризующий тип поддерживает копирование.

Поэтому, если он вам и правда нужен, возможно лучше использовать настоящий троичный тип — std::tribool.

boost::tribool*
Почему есть метод value_or, но нет value_or_get? Я имею ввиду аналог как в Java orElseGet. Возможность указать калбэк в качестве дефолтного значения (на случай если создание этого значения — тяжелая операция вроде запроса к базе). Вообще у Java много чего можно почерпнуть. Мне очень нравится их вариант Optional.
а чем вариант value_or_get(func) лучше, чем вариант value_or(func())?
Во втором случае функция вызовется вне зависимости от того, было ли это нужно.
А разве value_or не реализован как short circuit, то есть если value наличествует, то ветка or просто не выполяется? Тогда весьма странная реализация: всегда и в любом случае вызывать функцию даже если результат не нужен. Я ещё понимаю при and (и то не всегда требуется), но при or. Зачем?
Не вполне понял, что вы имеете в виду.
Стандарт C++17, [intro.execution.16]:
When calling a function (whether or not the function is inline), every value computation and side effect associated with any argument expression, or with the postfix expression designating the called function, is sequenced before execution of every expression or statement in the body of the called function.
Во втором случае (value_or(func())) мы имеем вызов функции value_or, которой передается параметр func(). Этот параметр будет вычислен до выполнения команд функции value_or. В первом же случае передающийся аргумент — это указатель на функцию, и сам вызов функции может и не происходить.
Понял. Протупил я маленько.
Спасибо за статью, написано очень понятно и просто!

Вы в списке вариантов применения std::optional упоминаете передачу ресурсов с отложенным доступом. Мы используем std::optional в нашем коде, но про такую возможность я слышу впервые. В статье этот вариант не раскрыт, вы не могли бы, пожалуйста, привести пример такого использования? Заранее спасибо!
Например, если у какого-либо ресурса нет конструктора по умолчанию и конструирование объекта занимает довольно длительное время. Тогда вы можете объявить std::optional, и передать этот объект дальше системе, а выполнять загрузку уже позднее по необходимости.
Не очень удачный пример использования. std::promise будет лучше отображать состояние обьекта, который когда-то будет создан.
Sign up to leave a comment.

Articles