2013-12-12 3 views
19

Друг попросил меня объяснить, почемуПочему это Const Const Const декларация действительна

const const const const const int const i = 0; 

является допустимым синтаксисом. Я отказался от каких-либо соображений по этому вопросу. Хотя мне любопытно, что это всего лишь грамматика?

Редактировать. Тег - это C++, мой друг ссылался на gcc, поэтому я, вероятно, должен добавить тег C.

+4

[. Это не] (http://coliru.stacked-crooked.com/a/77773912987e1506) –

+0

@GuilhermeBernal, субъект помеченной C++ , а не C. -1 – lucas92

+3

@ Konrad. Он действителен C, но недействителен C++. (did not намерение удалить) –

ответ

28

От n1256:

6.7.3/4

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

В C++ это должно приводить к ошибке.

От C++ 03 стандарта:

7.1.5/1 [dcl.type]

По общему правилу, не более одного типа спецификатора допускается в полной decl- specifier-seq декларации. Исключение составляют только :

- const или volatile может быть объединен с любым другим спецификатором типа. Однако избыточные cv-квалификаторы запрещены, за исключением случаев, когда они вводятся с использованием аргументов typedefs (7.1.3) или типа шаблона (14.3), и в этом случае избыточные cv-квалификаторы игнорируются.

От N3797 (C++ 11):

7.1.6/2 [dcl.type]

Как общее правило, не более одного типа Специфическое эр допускается в полный decl-spec-fi-seq декларации или в типе-спецификаторе или спецификатор типа trailing-type-speci-erq-seq. Единственным исключением из этого правила являются следующее:

— const can be combined with any type specifier except itself. 
+0

То же самое с '&', я верю. 'typedef int & t; typedef t & u;' будет означать, что 'u' и' t' будут одного типа. (Остерегайтесь литерала '&&', хотя это C++ 11) –

Смежные вопросы