Почему `operator->` in std :: Необязательный результат в UB, когда `*Это не является действительным?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему `operator->` in std :: Необязательный результат в UB, когда `*Это не является действительным?

Сообщение Anonymous »

Согласно CppReference, необязательный :: value () на std :: nullopt будет выбросить, в то время как привязки к необязательно , который является std :: nullopt ub.
У меня есть тесты, и, кажется, UB не может быть панирует в некоторых комбинированных ошибочно использованный. Я не говорю, что UB в порядке или значит, это ошибка. Однако, если это произойдет, неверный результат труднее отладить, чем паника. < /P>

Код: Выделить всё

struct I {
int get() { return 1; }
};

void f() {
try {
std::optional x = std::nullopt;
printf("%d\n", (*x)->get()); // -----> UB
}
catch (std::bad_optional_access & e) {
printf("it throws in f\n");
}
}
Мой вопрос заключается в том, почему std :: Необязательно предназначен для приведения к UB, а не набрать исключение, подобное значению () в операторе*/

Код: Выделить всё

operator->
?

Подробнее здесь: https://stackoverflow.com/questions/776 ... -not-valid
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»