web-dev-qa-db-fra.com

Si deux objets sont déclarés sur une même ligne, dans quel ordre sont-ils construits?

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?

63
pasha

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;T est un sek-spécificateur-décl et chaque Di 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.

78
erip

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.

52
Nemo

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 .

11
Yam Marcovic

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;
8
Pritam Banerjee

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
6
Andreas DM