Si deux objects sont déclarés sur une seule ligne, dans quel ordre sont-ils construits?

Disons qu’une classe a été définie comme

class A { //..... }; 

et maintenant je crée deux objects comme

 A a,b; 

Dans quel ordre a et b créés? Est-ce défini par la norme?

    De 8 déclarateurs [dcl.decl] 3:

    Chaque init-déclarateur dans une déclaration est analysé séparément comme s’il était dans une déclaration.

    Il continue à dire

    Une déclaration avec plusieurs déclarants est généralement équivalente à la séquence de déclarations correspondante, chacun avec un seul déclarant. C’est T D1, D2, ... Dn; est généralement équivalent à T D1; T D2; ... T Dn; T D1; T D2; ... T Dn;T est un déclin-spécificateur-seq et chaque Di est un init-declarator. 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éclaration, de sorte que lorsque les mêmes indicateurs de déclaration 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.

    La spécification C ++ chapitre 8 [dcl.decl] dit:

    Chaque init-déclarateur dans une déclaration est analysé séparément comme s’il était dans une déclaration. (100)

    Footnote (100) ajoute:

    (100) Une déclaration avec plusieurs déclarants est généralement équivalente à la séquence de déclarations correspondante, chacun avec un seul déclarant. C’est

     T D1, D2, ... Dn; 

    est généralement équivalent à

      T D1; T D2; ... T Dn; 

    … et nomme ensuite certaines exceptions, dont aucune ne s’applique dans des cas aussi simples.

    Donc, la réponse à votre question est que les objects sont construits dans l’ordre dans lequel vous les avez listés. Et non, ce n’est pas un opérateur de virgule.

    La commande est l’ordre écrit, de gauche à droite. En outre, ce n’est pas l’opérateur de virgule, mais simplement une liste de déclarants. Lorsqu’un opérateur de virgule défini par l’utilisateur est utilisé, l’ordre est en fait non spécifié.

    Voir l’ opérateur de virgule et les déclarants .

    a sera créé en premier et ensuite 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éclarateur dans une déclaration est analysé séparément comme s’il était dans une déclaration.

    Exemple:

     class A { public: A(std::ssortingng 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