43 votes

Pourquoi C ++11 ne prend-il pas en charge les structures anonymes, alors que C11 le fait?

C11 prend en charge anonyme structures, comme suit:

struct Foo
{
    struct
    {
        size_t x, y;
    };
};
struct Foo f;
f.x = 17;
f.y = 42;

Fondamentalement, les membres de l' struct sont traités comme s'ils étaient des membres de la enfermant struct ou union (de manière récursive, si l'affichage de la structure a été lui-même anonyme).

Quelle fut la raison de C++11 pas également y compris les anonymes structures? Ils n'ont que rarement utile (surtout à l'intérieur des syndicats, afin d'éliminer la saisie d'un identifiant pour l' struct), certainement. Mais ils semble assez évident, outre le cahier des charges (et déjà mis en œuvre par de nombreux compilateurs) qu'ils doivent surement avoir été discuté, à tout le moins, de préserver la compatibilité avec la norme C11. Alors pourquoi n'ont-ils pas ajouté?

44voto

Nicol Bolas Points 133791

Peu d'efforts ont été faits pour maintenir la compatibilité entre C++ et C sont les deux langues évoluent. Notez que la variable longueur de la pile de matrices ont été en C depuis 1999, mais n'ont pas été inclus dans C++11. Alors qu'ils n'ont généralement pas présenter les choses qui contredisent l'un l'autre, le comité C++ n'est pas exactement pencher en arrière pour s'assurer que le C++11 est compatible avec les versions de C au-delà de C89.

En outre, cette fonctionnalité serait assez complexe en C++, car un struct n'est rien de plus qu'un class. Et un anonyme struct/classe devrait avoir toutes les fonctionnalités d'un régulier de la structure de classe, oui? Sinon, quel est le point de l'avoir?

Que signifie la construction d'un inconnu, struct? Comment définiriez-vous le constructeur? Quelque chose d'aussi simple que:

struct Foo
{
    struct
    {
        size_t &x;
    };
};

n'est tout simplement pas possible, car l'intérieur struct n'a pas de constructeur. Et il n'y a aucun moyen de spécifier un. Un struct ne peut pas construire les membres d'un autre struct sein.

Quelque chose comme ceci:

struct Foo
{
    size_t outer;
    struct
    {
        void SomeFunc();
        size_t x;
    };
};

Ce this pointeur n' SomeFunc obtenir? Quel serait le type d' this , le sans nom et sans nom type? Comment voulez-vous même de définir SomeFunc à l'extérieur de la structure? Le nom de l' SomeFunc ne peut pas être Foo::SomeFunccar SomeFunc vit dans un intérieur de la portée.

C'est tout simplement trop complexe pour le C++ à traiter. Et certainement pas la peine assez pour la peine avec l'ajout de cette complexité pour.

4voto

Pour jouer l'avocat du diable et de la classe struct déclarations sont souvent utilisés pour envelopper spécifiques à la classe les déclarations de type.

typedef struct {

} name;

par conséquent, doivent être permis.

Donc

struct {

} 

devraient être ainsi.

Cependant, si nous considérons ceci comme une déclaration au sein d'une classe interne de l'espace de noms, il n'y aurait pas moyen d'accéder à l'intérieur de la structure.

Parce que struct != espace de noms en C, C peut faire des règles comme un accès à un anonyme, un struct dans les environs struct.

Pour le C++ pour permettre à ce dont il aurait besoin pour cas particulier de cette situation, ce qui devrait compliquer la résolution de nom.

Bien sûr, jouer du diable avocat du diable - C fait réellement cela. Elle a ajouté un niveau supplémentaire à la résolution de noms - si vous ne pouvez pas trouver le nom dans un stuct vérifier la structure de membres anonymes. Ce qui est un peu magique, d'une manière que je peux voir, C++ membres du comité de trouver ennuyeux.

Elle soulève également des questions - si un anonyme struct peut être consulté par le biais de sa classe parente, qu'en anonyme structs dans un espace de noms.

Bien sûr, si vous voulez vraiment le savoir, il suffit de demander Stroustrup - il répond aux e-mails.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X