una citazione da C++ 11 (17.5.2.1.2 tipi enumerati) standard:C++ 11 "tipi enumerati" (17.5.2.1.2)
1 Diversi tipi definiti nella Clausola 27 sono tipi numerati. Ogni tipo enumerato può essere implementato come un'enumerazione o come sinonimo di un'enumerazione (come un tipo intero, con valori interi costanti (3.9.1)).
2 Il tipo enumerato enumerato può essere scritto:
enum enumerated { V0 , V1 , V2 , V3 , ..... };
static const enumerated C0 (V0);
static const enumerated C1 (V1);
static const enumerated C2 (V2);
static const enumerated C3 (V3);
.....
3 Qui, i nomi C0, C1, ecc rappresentare elementi enumerati per questo particolare tipo enumerato. Tutti questi elementi hanno valori distinti.
Uno di questi "tipi enumerati" è "seekdir" dalla classe ios_base (27.5.3 Classe ios_base):
// 27.5.3.1.5 seekdir
typedef T4 seekdir;
static constexpr fmtflags beg = unspecified ;
static constexpr fmtflags cur = unspecified ;
static constexpr fmtflags end = unspecified ;
e
27.5.3.1.5 Tipo ios_base: : seekdir [ios :: seekdir]
typedef T4 seekdir;
1 Il tipo seekdir è un tipo enumerato (17.5.2.1.2) che contiene gli elementi indicati nella tabella 126.
Quindi, l'unico motivo sono richiesti i membri const e constexpr statici perché "tipi enumerati "possono essere implementati come tipo intero (es quando elencato è necessario definire costanti al posto di enumeratori), giusto?
Domanda 1. Se il fornitore di librerie decide di implementare seekdir come enumerazione deve ancora definire costanti statiche per i valori di enumerazione?
Domanda 2. PERCHE 'i "tipi enumerati" possono essere implementati come tipi interi in primo luogo? Cioè quando l'implementazione di enum (e nelle enumerazioni di C++ 11 può avere qualsiasi tipo di intero sottostante) senza quei membri statici costanti può essere peggiore dell'implementazione del tipo intero?
Domanda bonus: perché si dice 'static constexpr fmtflags beg = non specificato;' nella sinossi di 'ios_base' invece di' static constexpr seekdir beg = unspecified; '? - L'ho appena segnalato ai ragazzi dello Standard, sembra un errore di battitura. –
@Daniel "ha riferito questo ai ragazzi dello Standard" - cool, come si fa? :) Inoltre, TBH, anche dopo aver incollato la copia di quella citazione, non ho notato questo errore. – PowerGamer
Ho scritto una mail all'indirizzo indicato sulla copertina dello Standard. Dovrebbe essere abbastanza buono per un errore così ovvio, immagino. In generale, dovresti seguire [queste linee guida] (http://isocpp.org/std/submit-a-library-issue). –