2013-12-12 22 views
19

Un amico mi ha chiesto di spiegare perchéPerché questa dichiarazione const const const valido

const const const const const int const i = 0; 

è sintassi valida. Ho rifiutato di avere qualche idea sull'argomento. Anche se sono curioso di sapere se è solo una questione di grammatica?

Modifica. Tag è C++, il mio amico stava facendo riferimento a gcc, quindi dovrei probabilmente aggiungere il tag C.

+4

[. Non è] (http://coliru.stacked-crooked.com/a/77773912987e1506) –

+0

@GuilhermeBernal, il soggetto viene etichettato ++ , non C. -1 – lucas92

+3

@Konrad. È C valido ma C++ non valido. (non intendo eliminare) –

risposta

28

Da n1256:

6.7.3/4

Se lo stesso quali fi er appare più di una volta nella stessa speci fi er-quali fi er-list, direttamente o attraverso uno o più typedef, il comportamento è lo stesso come se apparisse solo una volta.

In C++, questo dovrebbe dare un errore.

Da C++ 03 di serie:

7.1.5/1 [dcl.type]

Come regola generale, al massimo un tipo-specifier è ammesso nel completa decl- specificatore-seq di una dichiarazione. Le uniche eccezioni a sono le seguenti:

- const o volatile può essere combinato con qualsiasi altro identificatore di tipo. Tuttavia, i qualificatori di cv ridondanti sono proibiti tranne quando sono introdotti tramite l'uso di typedefs (7.1.3) o argomenti del tipo di modello (14.3), nel qual caso i qualificatori di cv ridondanti vengono ignorati.

Da N3797 (C++ 11):

7.1.6/2 [dcl.type]

Come regola generale, al più un tipo specifico er è ammesso nel completo di decl-speci fi-seq di una dichiarazione o di un speci fi co specifi fi co-seq o di un sottosistema specifi- co-seq. Le uniche eccezioni a questa regola sono il seguente:

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

Lo stesso con '&', credo. 'typedef int & t; typedef t & u;' significa 'u' e' t' sono dello stesso tipo. (Attenzione letterale '&&' però, questo è C++ 11) –