2013-07-02 9 views
5

Poniższy kod kompiluje dobrze z clang. Chciałem wiedzieć, czy standard C++ jest w porządku z tym.'static void' jako specyfikator decl

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

Moim zdaniem żadne z deklaracji nie są ważne. Ten jeden taki test (nr 1) i clang (v3.4) zawodzą w tym.

Chociaż, jeśli usuwam statyczne z # 1, to raportuje błąd zgodnie z oczekiwaniami.

Spojrzałem na standardzie i znalazłem jeden akapit na statycznych danych (9.4.2-2), który mówi:

2 Deklaracja statycznej członka danych w swojej klasie de fi nicji nie jest Definicja i może być niekompletnego typu, innego niż cv-kwali fi kowana pustka. ...

Jak rozumiem ta linia dyskwalifikuje # 2 i # 3 są nieważne, ale nie jestem pewien co # 1. Czy są jakieś szczegóły dotyczące deklaracji z klasą pamięci statycznej, które powinny wykluczyć # 1?

Dzięki,

+1

to rozszerzenie klang. Jestem pewien, że przeczytałem o tym zobowiązaniu w przeszłości. –

+0

Jest to możliwe. W jakim kontekście to rozszerzenie może jednak być przydatne? –

+0

Zgaduję, że jeśli tworzysz 'szablon klasy' ze zmienną składową' T x', to może być użyteczne, aby nie przerwać, jeśli 'T = void' od razu. –

Odpowiedz

5

Nie, to nie jest dozwolone, właśnie ze względu na ust cytujesz. Zauważ, że termin "kwalifikowany przez cv" w cytowanym akapicie zawiera niekwalifikację. Zgodnie z pkt 3.9.3/10 o C++ 11 Standard:

W niniejszej normy międzynarodowej, notacja cv (lub cv1, cv2, itd.), Stosowany w opisie typów reprezentuje dowolna zestaw kwalifikatorów cv, tj. jeden z {const}, {volatile}, {,,

+0

Dzięki za szybką odpowiedź. Teraz zastanawiam się, jak trudno jest to naprawić. Albo powinienem poczekać, aż to zostanie naprawione. –

+0

@AdityaKumar: Niestety nie wiem - nigdy nie próbowałem zagłębiać się w kod źródłowy Clanga :( –

+0

Ayways, Bardzo dziękuję za odpowiedź –