descargar compiler c++ templates c++11 local-class

compiler - c++17



Clases locales: C++ 03 vs. C++ 11 (3)

De estándar anterior:

(14.3) Un tipo local, un tipo sin enlace, un tipo sin nombre o un tipo compuesto a partir de cualquiera de estos tipos no se debe utilizar como un argumento de plantilla para un parámetro de tipo de plantilla.

Parece ser eliminado en el estándar C ++ 11.

Más restricciones:

(9.8) Las declaraciones en una clase local solo pueden usar nombres de tipos, variables estáticas, variables y funciones externas, y enumeradores del alcance adjunto.

(9.8) Una clase local no debe tener plantillas de miembros.

(14.5.4) Una plantilla de amigo no se declarará en una clase local.

(9.4.2) Una clase local no debe tener miembros de datos estáticos.

(9.3) Las funciones miembro de una clase local (9.8) no tienen ningún vínculo.

¿Hay algún cambio en el uso de la clase local en C ++ 11?

Parece que en C ++ 03 las clases locales no se pueden usar como argumento de plantilla (eso lo recuerdo).

Considera este código,

template<typename T> 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.

Pero da error de compilación (modo C ++ 03), diciendo ( ideone ):

prog.cpp: 4: error: no hay función de coincidencia para la llamada a ''f (main () :: S)''

Sin embargo, compila bien cuando se compila en el modo C ++ 11 ( ideone ), lo cual tiene sentido para mí, de lo contrario, lambda no funcionaría. Así que supongo que hay al menos este cambio en el uso de las clases locales. ¿Estoy en lo cierto? ¿Cuáles son otros cambios relacionados con las clases locales?

Indique el texto relevante de los Estándares (C ++ 03 y C ++ 11 ambos) para que los lectores puedan comparar ellos mismos, y para referencia futura.


Las diferencias son visibles al comparar §14.3.1 / 2 en ambos estándares.

  • C ++ 03

    Un tipo local, un tipo sin enlace, un tipo sin nombre o un tipo compuesto a partir de cualquiera de estos tipos no se utilizarán como un argumento de plantilla para un parámetro de tipo de plantilla. [Ejemplo:

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

    -finalizar el ejemplo] [Nota: un argumento de tipo de plantilla puede ser un tipo incompleto (3.9). ]

  • C ++ 0x (n3290)

    [Ejemplo:

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

    - end example] [Nota: un argumento de tipo de plantilla puede ser un tipo incompleto (3.9). - nota final]

C ++ 03 desautoriza explícitamente las clases locales en los argumentos de tipo de plantilla. C ++ 11 no incluye e incluso incluye un ejemplo de uso válido de los mismos.


Según mi propia pregunta, la limitación se elimina y las clases locales se pueden usar como argumentos de plantilla.
Sin embargo, no veo referencias al nuevo estándar.