C ++ 11: dichiarazione dei membri di dati non statici come “auto”

C ++ 11 consente di dichiarare membri di dati non statici come “auto” se sono inizializzati nella dichiarazione? Per esempio:

struct S { auto x = 5; // in place of 'int x = 5;', which is definitely allowed }; 

GCC 4.7 rifiuta il codice sopra, mentre accetta int x = 5; .

Supponendo che questo non sia un bug del compilatore ma piuttosto lo standard non lo permette, perché no? Sarebbe utile quanto dichiarare auto variabili locali.

La regola per vietare membri non statici è nella clausola 7.1.6.4 4:

L’identificatore automatico del tipo può anche essere usato nel dichiarare una variabile nella condizione di un’istruzione di selezione (6.4) o un’istruzione di iterazione (6.5), nello specifier type-seq nel new-type-id o id-type di una nuova espressione (5.3.4), in una dichiarazione for range, e nel dichiarare un membro di dati statici con un inizializzatore brace-or-equal-che appare all’interno della specifica membro di una definizione di class (9.4.2) .

Ho trovato il motivo per cui è statico qui che riflette come James McNellis lo spiega nel commento.

A un organismo nazionale non piace consentire lo specificatore del tipo di auto per non statici. Da una e-mail agli autori:

  template< class T > struct MyType : T { auto data = func(); static const size_t erm = sizeof(data); }; 

Per determinare il layout di X, ora abbiamo la ricerca dei nomi in due fasi e ADL. Nota che func potrebbe essere un tipo o una funzione; può essere trovato in T, nello spazio dei nomi di MyType, nel namespace associato di T quando è istanziato, nel namespace globale, in uno spazio dei nomi anonimo o in qualsiasi namespace sobject ad una direttiva using. Con cura potremmo probabilmente lanciare qualche ricerca di concept_map per fortuna. In base all’ordine di inclusione dell’intestazione, potrei anche ottenere risultati diversi per ADL e interrompere la regola di una definizione, che non è richiesta per essere diagnosticata.

A causa di questa controversia, gli autori non propongono più l’authorization automatica per i membri di dati non statici.

Quindi, in base all’ordine di inclusione dell’intestazione, il tipo di data potrebbe essere molto diverso. Certo, auto x = 5; non dovrebbe dipendere dalla ricerca di nomi in 2 fasi o da ADL, tuttavia, presumo che abbiano fatto una regola “coperta” perché altrimenti avrebbero dovuto stabilire regole individuali per ogni caso d’uso che avrebbe reso le cose molto complicate .

Nello stesso articolo, l’autore propone di eliminare questa restrizione, tuttavia, sembra che questa proposta sia stata respinta probabilmente a causa delle motivazioni di cui sopra e anche perché il comportamento previsto possa essere lo stesso indipendentemente dall’inizializzatore.