class Test
{
enum{};
...
};
Questa definizione di enum vuota è portatile? Compilare in gcc ee msvc.È vuoto enum (enum {};) portatile?
class Test
{
enum{};
...
};
Questa definizione di enum vuota è portatile? Compilare in gcc ee msvc.È vuoto enum (enum {};) portatile?
tale enumerazione è specificatamente elencata nella clausola 7 paragrafo 3 dello standard C++ come non formato. gcc non lo accetta. c'era un bug fix per questo in gcc:
Mi era mancato. La grammatica consente la forma, ma nell'intestazione del capitolo, vi è un divieto specifico di, in effetti, qualsiasi dichiarazione che non dichiari né un tipo né un'entità (variabile, funzione o riferimento). E dà proprio questo caso come esempio. –
@Nawaz Il paragrafo citato da WeaselFox è presente in C++ 98, C++ 03 e C++ 11, invariato e con questo esatto esempio. –
Secondo il seguente frammento dallo standard C++ si può dedurre che è davvero una dichiarazione valida:
7,2/1 dichiarazioni di enumerazione (C++ 03)
...
enum-Prescrizione:
enum identificatore opt {enumeratore-list opt}
Nota che sia il identificatore e il enumeratore-list sono opzionali, e per questo una dichiarazione come enum {}
è valido (se chiedi lo standard).
Ma la norma non dice anche che le dichiarazioni vuote sono mal formate?
Sì, e c'è anche un esempio di enum { };
nello snippet di seguito dallo standard.
/3 Specificatori (C++ 03)
In questi casi e ogni volta che una classe specificatore o enum-specificatore è presente nel decl-specificatore-seq, gli identificatori in questi specificatori sono tra i nomi dichiarati dalla dichiarazione (come classe nomi, enum-nomi o enumeratori, a seconda della sintassi).
In questi casi, e fatta eccezione per la dichiarazione di un anonimo campo bit (9.6), il decl-specifier-ss introducono uno o più nomi nel programma, o sono ridichiarare un nome introdotto da una precedente dichiarazione .
* Esempio [
enum { }; // ill-formed
typedef class { }; // ill-formed
* esempio fine]
Conclusione
La dichiarazione sembra essere malato -formato dopo un attento esame dello standard, anche se i compilatori sono scritti da umani - e gli umani tendono a fare errori ea volte a trascurare le cose.
TL; DR Non dovrebbe usare una dichiarazione vuota come enum { };
, anche se si compila
Ma come sottolineato da WeaselFox, esiste un vincolo semantico generale, per le dichiarazioni __all__, in §7/3, che vieta effettivamente le dichiarazioni che non dichiarano nulla. Uno degli esempi che fornisce è 'enum {};'. –
@JamesKanze risposta aggiornata, grazie per l'heads up mi sono completamente dimenticato di '7.1/3'. –
@refp Anche me lo era mancato, finché WeaselFox non l'ha fatto notare. (E la sezione è §7/3, non §7.1/3.) –
Cosa stai usando per? – Cameron
In una macro che può avere un parametro vuoto –
Che non è solo un enum vuoto, è un enum vuoto anonimo, che, come detto nelle altre risposte, è mal formato perché non dichiara nulla. Quindi, le enumerazioni vuote sono valute, che non sono valide sono enumerazioni vuote anonime. Si potrebbe dichiarare sia 'enum {A}' che 'enum e {}', che sono dichiarazioni valide. –