53 votes

Étrange comportement des structures en C++ [partie 1]

Considérer:

struct box
{
    int array[3];
};

int main()
{
    box a = {1};
}

Si les travaux ci-dessus en C++ alors pourquoi ne pas les travaux suivants?

struct box
{
    int simple_int;
};

int main()
{
    box b = 2;
}

Quelle est la raison?

87voto

Eric Postpischil Points 36641

Correctement, l'ancien utiliserait box a = { { 1 } }, de sorte que vous avez une série de croisillons pour chaque agrégat. L'extérieur de l'appareil est de la structure, et l'intérieur est pour le tableau. Cependant, la langue vous permet d'omettre l'intérieur des accolades.

Dans ce dernier, il n'y a pas intérieur des accolades à omettre. Vous n'êtes pas autorisé à omettre extérieur bretelles; vous devez avoir au moins un jeu de bretelles pour distinguer une liste des initialiseurs pour un agrégat. Dans un sens, les accolades dire "Voici une liste de choses à mettre à l'intérieur de l'ensemble." Lorsque vous écrivez box b = 2, le compilateur ne sait pas que vous voulez mettre 2 à l'intérieur de l'agrégat. Au lieu de cela, il semble que vous essayez d'initialiser l' b objet (plutôt qu'une partie d'elle) 2. Ainsi, le compilateur essaie de trouver un constructeur ou une conversion qui change un 2 en box. Lorsque cela ne fonctionne pas, vous obtiendrez une erreur.

18voto

Neil Kirk Points 8980

Il ne fonctionne pas parce que votre syntaxe est incorrecte. Vous pouvez ajouter la prise en charge pour b = 2 avec un constructeur implicite, si c'est ce que vous voulez.

box b = {2}; // correct syntax with no constructor

Ou

struct box
{
    // implicit constructor
    box(int i) : i(i) {}
    int i;
};

box b(2);
box c = 2;

Ou

struct box
{
    explicit box(int i) : i(i) {}
    int i;
};

box b(2);
box c = 2; // disallowed

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