¿Qué podría significar esto en C ++ 11?
struct : bar {} foo {};
¿Qué podría significar esto en C ++ 11?
struct : bar {} foo {};
Respuestas:
Primero, tomaremos un UDT abstracto de tipo pantano (Tipo definido por el usuario):
struct foo { virtual void f() = 0; }; // normal abstract type
foo obj;
// error: cannot declare variable 'obj' to be of abstract type 'foo'
Recordemos también que podemos instanciar el UDT al mismo tiempo que lo definimos:
struct foo { foo() { cout << "!"; } }; // just a definition
struct foo { foo() { cout << "!"; } } instance; // so much more
// Output: "!"
Combinemos los ejemplos y recordemos que podemos definir un UDT que no tiene nombre :
struct { virtual void f() = 0; } instance; // unnamed abstract type
// error: cannot declare variable 'instance' to be of abstract type '<anonymous struct>'
Ya no necesitamos la prueba sobre el UDT anónimo, por lo que podemos perder la función virtual pura. También renombrando instance
a foo
, nos quedamos con:
struct {} foo;
Acercándose.
Ahora, ¿qué pasaría si este UDT anónimo derivara de alguna base?
struct bar {}; // base UDT
struct : bar {} foo; // anonymous derived UDT, and instance thereof
Finalmente, C ++ 11 introduce inicializadores extendidos , de modo que podemos hacer cosas confusas como esta:
int x{0};
Y esto:
int x{};
Y, finalmente, esto:
struct : bar {} foo {};
Esta es una estructura sin nombre derivada de la barra, instanciada como foo con un inicializador en blanco.