2015-09-12 28 views
8

Come negli stati delle domande, so che ci saranno degli attributi per gli spazi dei nomi e gli enumeratori in C++ 17. In che modo questo influenzerà il nostro codice? Quali sono questi attributi e cosa ci permetteranno di fare? Non sono riuscito a trovare alcuna buona risorsa per comprendere questa nuova funzionalità.Perché C++ 17 aggiunge attributi a domini ed enumeratori?

+3

Bene, ora è possibile deprecare uno spazio dei nomi o enum con attributi. Questi attributi sono gli stessi che esistono ora. – chris

+1

E questo è tutto? Sarà disponibile solo la deprecazione di namespace/enum? – DawidPi

+4

Se vuoi standardizzare nuovi attributi, vai a proporli. I compilatori come GCC e Clang supportano più dei pochi standard. Ad ogni modo, puoi leggere la [proposta] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4196.html) per motivi di motivazione. Devo anche modificare il mio commento precedente; Ho detto enumerazioni, ma avrei dovuto dire degli enumeratori. – chris

risposta

10

Attualmente, se si stesse per svalutare un particolare valore enum, è necessario fare affidamento sulle estensioni del compilatore. Per esempio, in clang, è necessario specificare enum deprecato Valori seguente modo:

enum OperationMode { 
    OM_Invalid, 
    OM_Normal, 
    OM_Terrified __attribute__((deprecated)), 
    OM_AbortOnError __attribute__((deprecated)) = 4 
}; 

Una volta che gli attributi enumerazioni e spazi dei nomi di supporto, ci sarà un modo cross-compilatore standard di implementare una funzionalità simile:

enum OperationMode { 
    OM_Invalid, 
    OM_Normal, 
    OM_Terrified [[deprecated("re-named to invalid")]], 
    OM_AbortOnError [[deprecated("exceptions are used instead")]] = 4 
}; 

Altri attributi uno giorno potrebbero trovare rilevanza per gli spazi dei nomi e dei valori enumerati, ma come lo scrittore proposta afferma:

Questo documento propone di risolvere questi problemi, consentendo attributi a essere specificato su enumeratori e spazi dei nomi ed estende l'attributo [[deprecato]] da applicare a queste entità, come era originariamente previsto per .