structs - ¿Por qué C++ 11 no admite estructuras anónimas, mientras que C11 sí?
struct c++ (2)
C11 es compatible con estructuras anónimas, así:
struct Foo
{
struct
{
size_t x, y;
};
};
struct Foo f;
f.x = 17;
f.y = 42;
Básicamente, los miembros de dicha struct
se tratan como si fueran miembros de la struct
o union
adjunta (recursivamente, si la estructura adjunta era en sí misma anónima).
¿Cuál fue la razón de ser de C ++ 11 que no incluye estructuras anónimas? Son poco útiles (sobre todo dentro de los sindicatos, para eliminar el tipeo de un identificador para la struct
), sin duda. Pero parecen una adición suficientemente obvia a la especificación (y una ya implementada por muchos compiladores) que seguramente se debieron haber discutido, al menos para preservar la compatibilidad con el estándar C11. Entonces, ¿por qué no fueron agregados?
Para jugar al defensor del diablo, las declaraciones de clase y estructura se usan a menudo para envolver las declaraciones de tipos específicos de clase.
typedef struct {
} name;
por lo tanto debería ser permitido.
Por lo tanto
struct {
}
debería ser así también.
Sin embargo, si consideramos esto como una declaración dentro del espacio de nombres interno de una clase, no habría forma de acceder al interior de la estructura.
Debido a que el espacio de nombres struct! = En C, C puede conformar reglas como el acceso a una estructura anónima a través de la estructura circundante.
Para que C ++ lo permita, se necesitaría un caso especial en esta situación, lo que complicaría la resolución del nombre.
Por supuesto, jugando al abogado del diablo del diablo - C en realidad lo hizo. Agregó un nivel extra para la resolución de nombres: si no puede encontrar el nombre en un enlace, verifique los miembros anónimos de la estructura. Lo cual es un poco mágico, de una manera que puedo ver a los miembros del comité de C ++ como molestos.
También plantea preguntas: si se puede acceder a una estructura anónima a través de su clase principal, ¿qué ocurre con las estructuras anónimas en un espacio de nombres?
Por supuesto, si realmente quieres saber, solo pregúntale a Stroustrup: responde a los correos electrónicos.
Se han realizado pocos esfuerzos para mantener la compatibilidad entre C ++ y C a medida que evolucionan los dos idiomas. Tenga en cuenta que las matrices de pila de longitud variable han estado en C desde 1999, pero no se incluyeron en C ++ 11. Si bien generalmente no introducen cosas que se contradicen entre sí, el comité de C ++ no está haciendo todo lo posible para asegurarse de que C ++ 11 sea compatible con las versiones de C más allá de C89.
Además, esta característica sería bastante compleja en C ++, porque una struct
no es más que una class
. Y una estructura / clase anónima debería tener todas las características de una estructura / clase regular, ¿sí? De lo contrario, ¿de qué sirve tenerlo?
¿Qué significaría construir una struct
sin nombre? ¿Cómo definirías el constructor? Algo tan simple como:
struct Foo
{
struct
{
size_t &x;
};
};
simplemente no es posible porque la struct
interna no tiene constructor. Y no hay forma de especificar uno. Una struct
no puede construir los miembros de otra struct
dentro de ella.
Para algo como esto:
struct Foo
{
size_t outer;
struct
{
void SomeFunc();
size_t x;
};
};
¿Qué obtiene this
puntero SomeFunc
? ¿Cuál sería el tipo de this
, el tipo sin nombre y sin nombre? ¿Cómo definirías SomeFunc
fuera de la estructura? El nombre de SomeFunc
no puede ser Foo::SomeFunc
, porque SomeFunc
vive en un ámbito interno.
Es demasiado complejo para C ++. Y ciertamente no vale la pena preocuparse por agregar esa complejidad para.