Подтвердить что ты не робот

В стандарте С++ указано, что указано, когда нарушено требование "требуется"?

Например, знаменитые слова (§3.2/1)

Никакая единица перевода не должна содержать более одного определения любой переменной, функции, типа класса, перечисления  тип или шаблон.

Я считаю, что требования "должны" интерпретироваться так, как будто они неявно следуют "иначе программа плохо сформирована", если не указано иное. Однако другие утверждают, что вместо этого "означает" означает "иначе поведение undefined".

В каждом случае я встречался в стандарте, в котором требование "нужно" не сопровождалось чем-то вроде "иначе поведение undefined" или "без необходимости диагностики", правило, в котором оно произошло, было одним который, очевидно, диагностируется и диагностируется всеми компиляторами, которых я знаю (приведенный выше абзац является примером). Поэтому я считаю, что это означает "в противном случае программа плохо сформирована", т.е. Требуется диагностика.

Во всяком случае, это только мои мысли. Я был бы признателен за авторитетный ответ.

4b9b3361

Ответ 1

Да, чтобы быть хорошо сформированным, программа должна следовать правилу Единого определения, которое вы указали в вопросе (§1.2.26):

хорошо сформированная программа

Программа на С++, построенная в соответствии с правилами синтаксиса, диагностическими семантическими правилами и Правилом определения (3.2).

Другие диагностируемые правила определяются как (§1.4):

1.4 Соответствие требованиям [intro.compliance]

1 Набор диагностируемых правил состоит из всех синтаксических и семантических правил в этом Международном стандарте, за исключением для тех правил, содержащих явное обозначение, что "никакой диагностики не требуется" или которые описаны как результат "undefined поведения".
2 Хотя в этом международном стандарте утверждены только требования к реализациям на С++, эти требования часто легче понять, если они сформулированы как требования к программам, частям программ или выполнению программ. Такие требования имеют следующее значение:
- Если программа не содержит нарушений правил в этом Международном стандарте, соответствующая реализация должна в пределах своих ресурсов принимать и правильно выполнять 2 эту программу.
- Если программа содержит нарушение любого диагностируемого правила или появление конструкции, описанной в этом стандарте, как "условно поддерживаемая", когда реализация не поддерживает эту конструкцию, соответствующая реализация должна выведите хотя бы одно диагностическое сообщение.
- Если программа содержит нарушение правила, для которого не требуется диагностика, в этом Международном стандарте нет требований к реализациям в отношении этой программы.
[выделено курсивом]

И да, как отмечено во втором пункте, если нарушение диагностического правила нарушено, требуется диагностика.

Ответ 2

В дополнение к ответу @JerryCoffin существует также Директивы ISO/IEC Часть 2 (которая регулирует все документы ISO/IEC, включая стандарт С++), в частности Приложение H Вербальные формы для выражения положений

Вербальные формы, показанные в таблице H.1, должны использоваться для обозначения требования, которые необходимо соблюдать, чтобы соответствовать документ и от которого отклонения не допускаются.

должен:

  • это,
  • требуется
  • требуется, чтобы
  • должен,
  • только... разрешено,
  • необходимо

не должен:

  • не разрешено [разрешено] [приемлемо] [допустимо],
  • требуется
  • требуется, чтобы... не было
  • не должно быть

Таким образом, нарушение требования "должно" делает программу плохо сформированной. Ответы на диагностические вопросы были даны в другом месте.