Ho una domanda sulla formulazione dello standard C++ 11 in quanto non ho dovuto scavare frequentemente in passato e di recente mi sono trovato confuso su (ovviamente poco importante) argomento di enumerazioni senza ambito.C++ 11 Accesso agli enumeratori senza ambito con nome qualificato
Recentemente ho sono imbattuto in un codice in una revisione del codice che stava usando un enum senza ambito, ma l'accesso alle enumeratori utilizzando nomi completi, in questo modo:
enum SomeEnum
{
EnumA,
...
};
void foo()
{
SomeEnum x = SomeEnum::EnumA;
}
ero certo che questo non ha funzionato e che SomeEnum doveva essere una classe di enum per questo comportamento, ma, abbastanza sicuro, compilato in modo pulito.
Sbirciare nello standard C++ 11, ho pensato in un primo momento che lo standard d'accordo con me:
§ 7.2 Dichiarazioni Enumeration: Ogni enum-nome e ciascuna senza ambito enumeratore è dichiarata nel ambito che contiene immediatamente l'identificatore enum . Ogni enumeratore con ambito è dichiarato nell'ambito dell'enumerazione .
Questo mi sembra indicare che gli enumeratori non disposti sono dichiarati solo nello spazio immediatamente contenuto dell'enum stesso. Non menziona che sono anche dichiarati nell'ambito di enumerazione.
Tuttavia, un po 'più in basso, lo standard include un esempio che mostra l'accesso a un enumeratore non spopolato utilizzando il nome completo.
Un rapido bit di ricerca su google e su SO mi ha dato un piccolo numero di punti che affermano che lo standard ora consente il nome completo, ma non c'è molta discussione. Si tratta solo di una formulazione debole nella specifica che viene chiarita dall'esempio, o c'è qualcos'altro che mi manca?
Ancora una volta, questo non è sconvolgente, ma spero che qualcuno possa mettermi sulla mia lettura dello standard e posso imparare qualcosa che potrebbe essere utile in una situazione futura.
Oppure, per semplificare, la domanda è completamente corretta su quali nomi sono dichiarati in quale ambito, è solo che esiste un'eccezione speciale per '::' dove 'A :: B' non cerca' B 'nell'ambito di' A'. – hvd
Mi ricordo in C++ 03, che gli enumeratori completamente qualificati hanno provocato un errore del compilatore. C++ 11 ha apportato una modifica per consentire agli enumeratori unscoped completamente qualificati? O era sempre permesso, ma i compilatori (guardando a MSVC) erano bacati/non conformi? –
@ void.pointer Vorrei solo usare Wandbox o Coliru e usare la flag '-pedantic' con gcc o clang, possiamo vedere [in questo esempio] (http://melpon.org/wandbox/permlink/WbjqktMcxle9UXk0) clang dice che è un'estensione C++ 11 in C++ 03. Sembra che [N2347] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2347.pdf) abbia aggiunto la dicitura. –