Disons qu'une classe a été définie comme
class A {
//.....
};
et maintenant je crée deux objets
A a,b;
Dans quel ordre a
et b
sont-ils créés? Est-il défini par la norme?
De 8 déclarateurs [dcl.decl] 3:
Chaque init-déclarator dans une déclaration est analysé séparément comme s'il était dans une déclaration par lui-même.
Il poursuit en disant
Une déclaration avec plusieurs déclarants est généralement équivalente à la séquence correspondante de déclarations, chacune avec un seul déclarant. C'est
T D1, D2, ... Dn;
est généralement équivalent àT D1; T D2; ... T Dn;
oùT
est un sek-spécificateur-décl et chaqueDi
est un init-déclarator. Une exception se produit lorsqu'un nom introduit par l'un des déclarants masque un nom de type utilisé par les spécificateurs de décl, de sorte que lorsque les mêmes spécificateurs de décl sont utilisés dans une déclaration ultérieure, ils n'ont pas la même signification.
Vous pouvez dire qu'ils sont construits de gauche à droite.
Le chapitre 8 de la spécification C++ [dcl.decl], dit:
Chaque init-declarator dans une déclaration est analysé séparément comme s'il était dans une déclaration par lui-même. (100)
La note de bas de page (100) poursuit:
(100) Une déclaration avec plusieurs déclarants équivaut généralement à la séquence correspondante de déclarations, chacune avec un seul déclarant. C'est
T D1, D2, ... Dn;
est généralement équivalent à
T D1; T D2; ... T Dn;
... puis cite quelques exceptions, dont aucune ne s'applique dans des cas aussi simples.
Donc, la réponse à votre question est que les objets sont construits dans l'ordre dans lequel vous les listez. Et non, ce n'est pas un opérateur virgule.
L'ordre est l'ordre écrit, de gauche à droite. De plus, ce n'est pas l'opérateur virgule, mais simplement une liste de déclarants. Lorsqu'un opérateur de virgule défini par l'utilisateur est utilisé, l'ordre n'est en fait pas spécifié.
Voir opérateur virgule et déclarateurs .
a sera créé en premier, puis b.
Les virgules dans ce cas seront utilisées comme séparateurs et non comme opérateurs.
Par exemple de wikipedia:
/**
* Commas act as separators in this line, not as an operator.
* Results: a=1, b=2, c=3, i=0
*/
int a=1, b=2, c=3, i=0;
Normes:
Déclarateurs [dcl.decl]:
Chaque init-déclarator dans une déclaration est analysé séparément comme s'il était dans une déclaration par lui-même.
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");
}
Production:
I am a
I am b