Дублирующий определитель констант разрешен в C, но не в С++?
Пример фрагмента кода
const const const int x = 10;
int main()
{}
скомпилируется в C, но не в С++. Почему он компилируется в C? Я думал, что это провалится и на C. Ничего.
Какая часть стандарта С++ запрещает использование дубликата const
и какая часть стандарта C позволяет это?
Ответы
Ответ 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. - конечная нота]