Почему `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

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