reparar redundancia puedo porque perder inicializar inicializa externo duro disco desde datos ciclica c++ c++11 gcc

c++ - redundancia - reparar disco duro sin inicializar



Comportamiento extraño de miembros constantes sin inicializar (3)

Considere este fragmento de código:

struct Foo { }; template<typename T> struct Bar { const T foo; }; int main() { Bar<Foo> test; }

Lo estoy compilando con g ++ - 4.9.2 con [-std = c ++ 11 -O0 -g3 -pedantic -Wall -Wextra -Wconversion] y obtengo un error: uninitialized const member in ''struct Bar<Foo>'' . Esto es bastante obvio.

¡PERO intente simplemente agregar std :: string como compila el miembro de Foo y el programa!

#include <string> struct Foo { std::string test; }; // (...)

Que pasa Reemplazar el tipo de prueba en doble causa que el programa no se compile nuevamente. ¿Qué cadena de miembros cambia en clase?

Enlace al compilador en línea con este fragmento.

Parece que gcc se comporta así desde la versión 4.6.


Creo que siempre debería producir un error. Clang lo hace. El estándar de C ++ dice en la cláusula (4.3) de §12.1.4 que el constructor predeterminado se elimina implícitamente cuando

- cualquier miembro de datos no estáticos no variante de tipo cualificado por const (o conjunto de ellos) sin inicialización de refuerzo o igual no tiene un constructor predeterminado proporcionado por el usuario,

Como Foo no tiene un constructor predeterminado provisto por el usuario, Bar debería tener un constructor predeterminado eliminado de manera implícita y, por lo tanto, crear una instancia de la Bar<Foo> test en la principal debería producir un error.

Tal vez reportar un error a GCC?


Parece que g ++ genera automáticamente un constructor predeterminado, incluso cuando los miembros const deberían haberse inicializado en el momento de la construcción porque sabe que una cadena tiene un constructor predeterminado que la inicializa a una cadena vacía. De hecho todo sucede como si la fuente fuera:

struct Foo { std::string test; Foo():test() {;} }; template<typename T> struct Bar { const T foo; Bar(): foo() {;} }; int main() { Bar<Foo> test; }

que compila bien tanto con clang y MSVC.

(pero debo admitir que todavía no he encontrado la referencia en gcc doc que explica que ...)


Si tiene un miembro const data en su clase / estructura, entonces el compilador no generará el constructor predeterminado para eso. Tiene que definirlo explícitamente e inicializar ese miembro const (no asignarlo).

Debe ser un error en ambos casos.