В этой заметке объясняется, что может сделать реализация, если она встречает код, для которого нет определенного поведения. Слово «допустимый» не предназначено для ограничения, скорее приведены некоторые примеры общего поведения.
Интересно отметить, что компилятор почти всегда должен что-то компилировать! Рассмотрим этот фрагмент кода:
void f() { 1 / 0; }
поведение переводчика при столкновении с этим не очень хорошо определено, но он не может просто делать то, что ему нравится! Фактически, если это компилятор, он все равно необходим для компиляции этого модуля компиляции. Это потому, что поведение программы, содержащей эту функцию, все еще может быть четко определено! Компилятор не может знать, вызвана ли функция. Фактически этот вопрос возник, когда функция была «main ()», и контроль наверняка проходил через нулевое деление, и в результате компилятору не разрешалось отклонять даже эту программу. Причина в том, что программа по-прежнему правильно сформирована, и компилятор, отвечающий требованиям, должен принимать все правильно сформированные программы (и отклонять все неправильно сформированные программы и выдавать диагностическое сообщение об ошибке, если не указано иное).
Это не может быть легко сделано неправильно, потому что трудно точно указать, каким образом умные компиляторы могут требовать обнаружения, когда должно произойти деление на ноль.
Интересно, что утверждение Стандарта о том, что оно «не предъявляет никаких требований», на самом деле очень близко к ошибочности. Это характеристики системы компиляции, поддерживающей отдельную компиляцию, которая не может определить, выполняется ли на самом деле часть кода, для которой нет четко определенного поведения, и поэтому компилятору на самом деле требуется для компиляции в любом случае, потому что это не может сделать вывод, если программа имеет неопределенное поведение.