Supposons qu'une classe ait été définie comme suit
class A {
//.....
};
et je crée maintenant deux objets en tant que
A a,b;
Dans quel ordre sont a
y b
créé ? Est-il défini par la norme ?
Supposons qu'une classe ait été définie comme suit
class A {
//.....
};
et je crée maintenant deux objets en tant que
A a,b;
Dans quel ordre sont a
y b
créé ? Est-il défini par la norme ?
De 8 déclarants [dcl.decl] 3 :
Chaque init-déclarant d'une déclaration est analysé séparément comme s'il se trouvait dans une déclaration à part entière.
Il poursuit en disant
Une déclaration comportant plusieurs déclarants est généralement équivalente à la séquence correspondante o déclarant. [ ]
T D1, D2, ... Dn;
iT D1; T D2; ... T Dn;
oùT
est un decl-specifier-seq et chaqueDi
est un déclarateur d'init. Une exception se produit lorsqu'un nom introduit par l'un des des déclarants cache un nom de type utilisé par les spécificateurs de déclin, de sorte que lorsque le même nom de type est utilisé par les spécificateurs de déclin, le nom de type est caché. suivante, ils n'ont pas la même signification.
On peut dire qu'ils sont construits de gauche à droite.
Le chapitre 8 de la spécification du C++ [dcl.decl], dit :
Chaque init-declarator dans une déclaration est analysé séparément comme s'il était dans une déclaration est analysé séparément comme s'il figurait dans une déclaration en tant que telle. (100)
La note de bas de page (100) se poursuit ainsi :
(100) Une déclaration comportant plusieurs déclarants est généralement équivalente à l'option séquence correspondante de déclarations comportant chacune un seul déclarant. C'est-à-dire
T D1, D2, ... Dn;
est généralement équivalent à
T D1; T D2; ... T Dn;
...et cite ensuite quelques exceptions, dont aucune ne s'applique à des cas aussi simples.
La réponse à votre question est donc que les objets sont construits dans l'ordre dans lequel vous les avez énumérés. Et non, il ne s'agit pas d'un opérateur à virgule.
@SergeyA En lisant les exceptions, auquel cas "habituellement" devient "non", puis en prenant le complément pour l'affirmative :)
L'ordre est l'ordre écrit, de gauche à droite. Il ne s'agit pas non plus de l'opérateur virgule, mais simplement d'une liste de déclarants. Lorsqu'un opérateur virgule défini par l'utilisateur est utilisé, l'ordre n'est en fait pas spécifié.
Véase opérateur virgule y déclarants .
Normes :
Déclarateurs [dcl.decl] :
Chaque init-déclarant d'une déclaration est analysé séparément comme s'il se trouvait dans une déclaration à part entière.
Exemple :
class A {
public:
A(std::string const &s): name(s)
{
std::cout << "I am " << name << '\n';
}
std::string name;
};
auto main() -> int
{
A a("a"), b("b");
}
Sortie :
I am a
I am b
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.
13 votes
La virgule dans une déclaration n'est pas l'opérateur virgule, c'est simplement un séparateur.
2 votes
Duplicata possible de Comment fonctionne l'opérateur virgule
13 votes
Dans ce cas, il ne s'agit pas de l'opérateur virgule.
0 votes
Nous n'utilisons pas l'opérateur virgule ici.
0 votes
Vous pouvez tester ceci.
0 votes
@NathanOliver cette question contient toutes les réponses. Regardez le commentaire 4 de CygnusX1. Il explique quand la virgule est un opérateur et quand elle ne l'est pas, et comment elle se comporte.
4 votes
@Zakkery Mais il ne répond pas à la question de savoir dans quel ordre les objets sont initialisés.
19 votes
@donjuedo je peux le tester mais je ne saurais pas si le résultat dépend de l'implémentation ou non.
2 votes
@pasha, Vous avez raison. Il pourrait y avoir une différence entre l'implémentation et la norme. Par ailleurs, le fait d'obtenir une réponse sur StackOverflow peut vous amener à vous demander s'il y a une différence entre la réponse et la norme ;-)
5 votes
@donjuedo Pas si la réponse cite la norme ;)
1 votes
@NathanOliver Excellent !
1 votes
Si vous dépendez d'un ordre de construction particulier, vous devez l'indiquer clairement en séparant les déclarations (quel que soit l'ordre garanti par la norme pour une déclaration d'une seule ligne).