2015-10-21 17 views
8

Per quanto posso vedere nello standard, il seguente codice è valido. Compilare in MSVC1025.Ambiguità standard C++

const struct omg; 
struct omg volatile; 

int main() 
{ 
    return 0; 
} 

Le qualificazioni const e volatile sembrano senza scopo di tali dichiarazioni. Non aiutano né danneggiano né il compilatore né il programmatore.

Lo standard non sembra intenzionato a eliminare queste "ambiguità vuote". Nel caso della dichiarazione vuota ;, è esplicitamente consentito.

Esistono altri casi di token che, dopo aver preelaborato, sono irrilevanti per il significato dell'espressione?

+1

[ 'register'] (http: // stackoverflow.com/questions/3207018/register-keyword-in-c) –

+8

Non considererei MSVC un arbitro affidabile di ciò che lo standard consente o richiede. E sono propenso a dubitare che la situazione cambierà entro l'anno 11025 :-) –

+2

fallisce su g ++: http://coliru.stacked-crooked.com/a/b486009ecb10f5e7 – NathanOliver

risposta

4

Entrambi clang e gcc rifiutare questo codice utilizzando -pedantic-errors. clang fornisce il seguente errore:

error: 'const' is not permitted on a declaration of a type [-Werror,-Wmissing-declarations] 
const struct omg; 
^ 

error: 'volatile' is not permitted on a declaration of a type [-Werror,-Wmissing-declarations] 

il progetto di C++ sezione standard 7.1.6.1 il CV-qualificazioni [dcl.type.cv] dice:

[...]If a cv-qualifier appears in a decl-specifier-seq, the init-declarator-list of the declaration shall not be empty.[...]

+0

Ho upvoted e accettato la tua risposta anche se non ha risposto alla mia domanda come era formulato. Stavo cercando irrelevancies come 'if (true); non sono né espressioni complete né dipendono da altre dichiarazioni/espressioni – Hector

+0

@Hector Ho completamente perso questo aspetto della tua domanda, ho letto in un altro in senso stretto. È possibile che tu riceva una risposta più ampia, che non sarebbe inusuale. Dovresti sentirti libero di non accettare nel frattempo, le domande senza un consenso di solito ottengono più punti di vista e altre volte più risposte e vorrei capire completamente. –

+0

@Hector in generale lo standard evita l'ambiguità e rende tali casi comportamenti malformati o indefiniti. In altri casi lo standard definirà come risolvere le ambiguità. Ciò ha senso dal momento che uno degli obiettivi di uno standard è quello di rimuovere potenziali ambiguità e fornire implementazioni uniformi. –