¿Qué es esta sintaxis loca de C ++ 11 ==> struct: bar {} foo {} ;?


Respuestas:


262

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 instancea 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.


11
Sé que deben evitarse los comentarios negativos sobre un lenguaje de programación, y tal vez esté un poco fuera de tema aquí. Pero no entiendo por qué C ++ 0x se está convirtiendo en un lenguaje aún más complejo que C ++. ¿Quién quiere eso? ¿Cuáles son las ventajas de un lenguaje de programación que se está volviendo cada vez más críptico? Esta declaración es en mi humilde opinión otro ejemplo más de esto. He estado usando C ++ durante muchos años y todavía tengo dificultades para dominar este lenguaje.
Giorgio

26
@ Jorge: ¿Por qué es esto un problema? ¿Qué te asusta exactamente? La construcción descrita es un caso marginal permitido por el lenguaje y se deduce naturalmente de sus conceptos centrales, no tiene nada de malo. También es de utilidad muy limitada. Nunca tendrás que usarlo. Sin embargo, es sintácticamente lógico y no choca ni entra en conflicto con nada. Entonces, ¿por qué sería un argumento en contra de un lenguaje, especialmente uno que está excepcionalmente bien diseñado?
Kerrek SB

13
@Giorgio: la parte maravillosa es que la situación es exactamente lo contrario; c ++ 0x está agregando muchas instalaciones poderosas tan esperadas sin ser críptico o demasiado feo; quieres críptico? - Mira Perl. Este ejemplo aquí en ninguna parte se acerca al título de críptico.
Gene Bushuyev

18
@Kerrek SB Creo que C ++ (y ahora C ++ 0x) tiene simplemente demasiados conceptos diferentes y aprender la sintaxis y la semántica es difícil. Cada programador (yo soy uno de ellos) termina usando un subconjunto del lenguaje porque hay muchas maneras diferentes de hacer lo mismo. No creo que C ++ esté bien diseñado. Hay muchas características ad-hoc y faltan ciertas cosas fundamentales, como un mecanismo robusto de módulo (importación / exportación) (todavía se usa el antiguo #include de C). Creo que el esfuerzo de C ++ 0x debería apuntar a hacer que C ++ sea más pequeño y fácil de usar, no más grande.
Giorgio

31
@Giorgio: Para ser honesto, cualquier esfuerzo de este tipo tendría que trabajar para reconstruir C ++ desde cero, es decir, crear un nuevo lenguaje . Y eso se ha hecho ... muchas veces.
ligereza corre en órbita el

106

Esto define:

  • una estructura anónima
  • que se deriva públicamente de bar
  • cual (anonymously ) no define nada más que lo que deriva debar
  • y finalmente, se crea una instancia, llamada "foo",
  • con una lista de inicializadores vacía

struct : bar {} foo {};
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.