std::optional
(без эксперимента, C ++ 17 на нас) определяет два различных интерфейса для доступа к его необязательному члену: проверенный доступ (std::optional::value
) и незарегистрированный доступ (operator*
).
Использование проверенного доступа имеет два потенциальных недостатка: во-первых, он замедляет выполнение, потому что выполняется ветвь, и, во-вторых, в случае отсутствия значения он вызывает исключение, что может быть нежелательно с точки зрения потока управления.В то время как вторая проблема может быть устранена посредством явной проверки наличия значения (std::optional::has_value
) перед вызовом значения, затраты производительности во время выполнения все еще могут быть там.
У непроверенного доступа нет затрат на производительность, связанных сэто, но может быть безопасно использовано, только если вы знаете, что значение есть там каким-либо другим способом (то есть вы проверяли has_value
ранее).В противном случае поведение программы не определено, и мы не хотим этого.
Из вышесказанного должно быть очевидно, что второй показанный вами фрагмент кода является чрезмерным:
if (some_str.hasvalue())
some_str.value().c_str();
проверка наличия значений дважды (по крайней мере, семантически компиляторы, вероятно, смогут оптимизировать вторую проверку).Тем не менее, более понятный код будет
if (some_str.hasvalue())
some_str->c_str();