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

Дублирующий определитель констант разрешен в C, но не в С++?

Пример фрагмента кода

const const const int x = 10;   
int main()
{}

скомпилируется в C, но не в С++. Почему он компилируется в C? Я думал, что это провалится и на C. Ничего.

Какая часть стандарта С++ запрещает использование дубликата const и какая часть стандарта C позволяет это?

4b9b3361

Ответ 1

C99 §6.7.3/4:

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

Да, это действительно C99, и ваше открытие верное.

Ответ 2

Из последнего проекта С++ 0x, [dcl.type]:

Как правило, в полном объявлении-спецификаторе-seq объявления или в типе-спецификаторе-seq или концевом типе-спецификаторе-дескриптора разрешено не более одного спецификатора типа. Единственными исключениями из этого правила являются следующие:

- const может быть объединен с любым спецификатором типа, кроме самого себя.

- volatile может быть объединен с любым спецификатором типа, кроме самого себя.

- подписанный или unsigned может быть объединен с char, long, short или int.

- короткий или длинный может быть объединен с int.

- long можно объединить с двойным.

- long может сочетаться с длинными.

Ответ 3

С++ 2003 запрещает его в 7.1.5/1 "... избыточные cv-квалификаторы запрещены, за исключением случаев, когда они вводятся с использованием типов typedefs или аргументов типа шаблона...".

Ответ 4

Похоже, что грамматика С++ 0x позволяет:

резюме-спецификатор-сл:

  • cv-qualifier cv-qualifier-seq opt

резюме-классификатор:

  const

  volatile

Кроме того, [decl.type.cv] позволяет ему:

Существует два cv-квалификатора, const и volatile. Если в спецификаторе-указателе-seq появляется спецификатор cv, список деклараций init-declarator не должен быть пустым. [Примечание: 3.9.3 и 8.3.5 описывают, как cv-qualifers ffctct объектов и типов функций. - конец примечания] Избыточные cv-квалификации игнорируются. [Примечание: например, эти могут быть введены typedefs. - конечная нота]