C ++ охватывает идею неопределенного поведения.
Не все операции C ++ имеют поведение, определенное стандартом. Это позволяет компиляторам предполагать, что они никогда не происходят, и во многих случаях может привести к гораздо более быстрому коду.
Здесь, если оставить результат использования неотключенного std::optional
неопределенным, то это стоимость доступа к данным, хранящимся в std::optional
, равна стоимости доступа к данным, не сохраненным в std::optional
. Единственные затраты - это дополнительная комната, и вы, как программист, пообещаете отследить, занят он или нет.
Теперь компиляторы могут свободно вставлять туда проверки, а некоторые делают в отладочных сборках.
Обратите внимание, что обычно типы библиотек C ++ std
включают безопасный и небезопасный методы доступа к данным.
Тот факт, что неверные указатели иногда приводят к появлению сигсева, объясняется тем, что большинство ОС защищают адреса около 0 и аварийно завершают программы, которые обращаются к нему. Это потому, что это было дешево, и оно улавливает кучу плохого поведения во многих программах на ассемблере, C и C ++.
Если вы хотите опционально бросать, когда пусто, используйте .value()
. Если нет, используйте operator*
. Если вам нужно значение по умолчанию, если его там нет, используйте .value_or
.