C ++, в отличие от большинства других языков, имеет понятие неопределенное поведение .Это означает, что недопустимые действия не приводят к исключению, а к сбою, повреждению данных или чему-то еще. исключение в C ++ - это то, что код явно throw
s и catch
es.Это не так в вашем коде.
Результат (test ? "A String" : 0)
равен const char *
.Таким образом, 0
преобразуется в const char *
, то есть указатель NULL.Стандартная библиотека имеет перегрузку для operator <<
, которая ожидает, что const char *
будет ненулевой C-строкой.
То есть operator <<
просто не проверяет входной параметрдля NULL.И отсылка к нулевому указателю - неопределенное поведение.В большинстве систем это приведет к ошибке сегментации на уровне ОС и завершению программы.
Для полноты, в MSVC вы можете скомпилировать с /EHa
, чтобы рассматривать исключения SEH как исключения C ++, тогда catch(...)
такжепоймать тех.Но не используйте эту функцию, так как она может привести к утечке ресурсов и непереносимому, не поддерживаемому коду.