[Пересмотренный ответ основан на новой информации / знаниях.См. Также ответ Джонатана Уэйкли (я обновил его до того, как увидел это), который является автором gcc / libstdc ++ и кто воспользовался отчетом об ошибках, который я отправил.Большое спасибо ему за прямые и искренние извинения за абсурдное предположение, что ostream
будет когда-либо вести себя так, как я описывал вначале.]
Что вы на самом деле делаете, на данный моментПо сути, это означает следующее:
std::cout << (const char *) nullptr << std::endl;
И то, что большинство людей ожидают получить (хотя, строго говоря, поведение того, что вы там делаете, не определено), будет SEGFAULT.
libstdc++,
однако, который содержит реализацию ostream
, которую использует gcc
, делает что-то другое.Он устанавливает badbit
в потоке, и , только если вы включили badbit
exception (которые по умолчанию отключены), он (также) выдает исключение.Спасибо Джонатану Уэйкли за то, что он указал мне на это, когда я отправил отчет об ошибке, я ничего об этом не знал (и, очевидно, никто не публиковал сообщения в этой теме), когда я опубликовал первую версию этого ответа.
Но ваш код не включил указанные исключения, поэтому все, что происходит, это то, что badbit
устанавливается на cout
, и все последующие записи впоследствии молча завершаются неудачей.Ранее я неверно истолковал это как программу, тихо завершающую работу при передаче nullptr, но я ошибся, и я извиняюсь перед разработчиками за такое необоснованное предположение.Об этом подробнее говорится в комментариях.
Итак, чтобы получить исключение, когда это происходит, вы должны включить исключение badbit
в потоке, что вы можете сделать так:
std::cout.exceptions (std::ostream::badbit | std::ios::failbit);
Тогда вы получите исключение, на которое надеялись.Лично мне не очень нравится такое поведение, я бы предпочел SEGFAULT (и на самом деле, с clang, вы делаете ), но Джонатан говорит мне, что так было с 2002 года, и разработчикиесть веские причины не менять его сейчас.
Появилась новая live demo , показывающая поведение gcc
с добавленной выше строкой, и теперь вывод:
[20]
[0]
[Neelakantan]
terminate called after throwing an instance of 'std::__ios_failure'
what(): basic_ios::clear: iostream error
[
Aborted
Так что, будьте осторожны, ловушка для неосторожных лежит в ожидании: «Почему ни одно из моих заявлений о регистрации не появляется внезапно?», Или что-то в этом роде.