Interesante, ¿lo encontraste útil para algo? Supongo que es un truco generar instancias únicas de tipo fuerte (tipos etiquetados).
AlfC
@alfC: No es particularmente útil, no
carreras ligeras en órbita el
Respuestas:
262
Primero, tomaremos un UDT abstracto de tipo pantano (Tipo definido por el usuario):
struct foo {virtualvoid 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 definitionstruct foo { foo(){ cout <<"!";}} instance;// so much more// Output: "!"
Combinemos los ejemplos y recordemos que podemos definir un UDT que no tiene nombre :
struct{virtualvoid 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 UDTstruct: 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.
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",
Respuestas:
Primero, tomaremos un UDT abstracto de tipo pantano (Tipo definido por el usuario):
Recordemos también que podemos instanciar el UDT al mismo tiempo que lo definimos:
Combinemos los ejemplos y recordemos que podemos definir un UDT que no tiene nombre :
Ya no necesitamos la prueba sobre el UDT anónimo, por lo que podemos perder la función virtual pura. También renombrando
instance
afoo
, nos quedamos con:Acercándose.
Ahora, ¿qué pasaría si este UDT anónimo derivara de alguna base?
Finalmente, C ++ 11 introduce inicializadores extendidos , de modo que podemos hacer cosas confusas como esta:
Y esto:
Y, finalmente, esto:
Esta es una estructura sin nombre derivada de la barra, instanciada como foo con un inicializador en blanco.
fuente
Esto define:
bar
anonymously
) no define nada más que lo que deriva debar
fuente