Classi locali: C ++ 03 vs C ++ 11

C’è qualche cambiamento nell’uso della class locale in C ++ 11?

Sembra che in C ++ 03 le classi locali non possano essere utilizzate come argomento modello (lo ricordo).

Considera questo codice,

template void f(const T&) {} //Note : S is a local class defined inside main() int main() { struct S{}; f(S()); } //I want template argument to be deduced. 

Ma dà errore di compilazione (modalità C ++ 03), dicendo ( ideone ):

prog.cpp: 4: errore: nessuna funzione di matching per la chiamata a ‘f (main () :: S)’

Tuttavia, compila bene quando lo compila in modalità C ++ 11 ( ideone ), il che ha senso per me, altrimenti lambda non funzionerebbe. Quindi immagino che ci sia almeno questo cambiamento nell’uso delle classi locali. Ho ragione? Quali sono gli altri cambiamenti riguardanti le classi locali?

Si prega di citare il testo pertinente dagli Standard (C ++ 03 e C ++ 11 entrambi) in modo che i lettori possano confrontarsi e per riferimento futuro.

Le differenze sono visibili confrontando §14.3.1 / 2 in entrambi gli standard.

  • C ++ 03

    Un tipo locale, un tipo senza collegamento, un tipo senza nome o un tipo composto da uno di questi tipi non deve essere usato come argomento modello per un parametro tipo di modello. [Esempio:

     template  class X { /* ... */ }; void f() { struct S { /* ... */ }; X x3; // error: local type used as template-argument X x4; // error: pointer to local type used as template-argument } 

    -End esempio] [Nota: un argomento di tipo template può essere un tipo incompleto (3.9). ]

  • C ++ 0x (n3290)

    [ Esempio:

     template  class X { }; template  void f(T t) { } struct { } unnamed_obj; void f() { struct A { }; enum { e1 }; typedef struct { } B; B b; X x1; // OK X x2; // OK X x3; // OK f(e1); // OK f(unnamed_obj); // OK f(b); // OK } 

    – fine esempio] [Nota: un argomento del tipo di modello può essere un tipo incompleto (3.9). – nota finale]

C ++ 03 disabilita esplicitamente le classi locali negli argomenti del tipo di modello. C ++ 11 non ha, e include anche un esempio di un uso valido di tale.

Da standard più vecchi:

(14.3) Un tipo locale, un tipo senza collegamento, un tipo senza nome o un tipo composto da uno di questi tipi non deve essere usato come argomento modello per un parametro tipo di modello.

Sembra essere rimosso nello standard C ++ 11.

Più restrizioni:

(9.8) Le dichiarazioni in una class locale possono utilizzare solo nomi di tipi, variabili statiche, variabili esterne e funzioni ed enumeratori dall’ambito di inclusione.

(9.8) Una class locale non deve avere modelli di membri.

(14.5.4) Un modello amico non deve essere dichiarato in una class locale.

(9.4.2) Una class locale non deve avere membri di dati statici.

(9.3) Le funzioni membro di una class locale (9.8) non hanno alcun collegamento.

In base alla mia domanda, la limitazione viene rimossa e le classi locali possono essere utilizzate come argomenti del modello.
Non vedo però alcun riferimento al nuovo standard.