2013-07-02 25 views
5

Il seguente codice compila bene con clang. Volevo sapere se lo standard C++ va bene con questo.'static void' come decl-specificatore

class A { 
    static void x; // #1 
    static const void x; // #2 
    static volatile void x; // #3 
}; 

A mio parere nessuna delle dichiarazioni è valida. Lo perenial C++ standard validation suite ha un tale test (# 1) e clang (v3.4) non riesce.

Sebbene, se rimuovo statico dal numero 1, allora clang segnala l'errore come previsto.

ho guardato lo standard e ho trovato un paragrafo sui membri di dati statici (9.4.2-2), che dice:

2 La dichiarazione di un membro di dati statici nella sua classe de fi nizione non è un definizione e può essere di un tipo incompleto diverso dal vuoto cv-qualificati. ...

Come ho capito, questa linea squalifica il n. 2 e il n. 3 come non validi, ma non sono sicuro del n. Ci sono altri dettagli relativi alla dichiarazione con la classe di archiviazione statica che dovrebbe escludere il numero 1?

Grazie,

+1

questa è un'estensione clang. Sono abbastanza sicuro di aver letto il commit su di esso in passato. –

+0

È possibile. In quale contesto questa estensione potrebbe eventualmente essere utile? –

+0

Suppongo che se si istanzia un 'modello class' con una variabile membro' T x', potrebbe essere utile non interrompere se 'T = void' subito. –

risposta

5

No, questo non è consentito, proprio a causa del paragrafo citate. Si noti che il termine "qualificati cv" nel paragrafo citato include la non qualifica. Per il paragrafo 3.9.3/10 del C++ 11 standard:

nella presente norma internazionale, la notazione cv (o cv1, cv2, ecc), utilizzato nella descrizione dei tipi, rappresenta un arbitrario set di qualificatori di cv, ovvero uno di {const}, {volatile}, {const, volatile}, o il set vuoto.

+0

Grazie per una risposta così rapida. Ora mi chiedo quanto sia difficile risolvere questo in clang. O dovrei aspettare che venga risolto. –

+0

@AdityaKumar: Purtroppo non lo so - non ho mai provato ad approfondire il codice sorgente di Clang :( –

+0

Ayways, la ringrazio molto per la risposta –