62 votes

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

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 ?

13 votes

La virgule dans une déclaration n'est pas l'opérateur virgule, c'est simplement un séparateur.

2 votes

13 votes

Dans ce cas, il ne s'agit pas de l'opérateur virgule.

78voto

erip Points 897

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; i T D1; T D2; ... T Dn;T est un decl-specifier-seq et chaque Di 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.

8 votes

Il m'a battu de 45 secondes :-)

0 votes

Merci pour votre réponse. Puis-je faire T D1,D2=D1 ; ou non ?

2 votes

@pasha T D1,D2=D1; devient T D1; T D2=D1; par les règles, donc oui.

52voto

Nemo Points 32838

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.

7 votes

Comment comprenez-vous le terme "habituellement" dans ce contexte ?

9 votes

@SergeyA En lisant les exceptions, auquel cas "habituellement" devient "non", puis en prenant le complément pour l'affirmative :)

5 votes

@erip, c'est tout un processus :)

11voto

Yam Marcovic Points 1566

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 .

8voto

a sera créé en premier et ensuite b .

Virgules dans ce cas seront utilisés comme séparateurs et non en tant qu'opérateurs.

Par exemple, d'après 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;

6voto

Andreas DM Points 4427

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

3 votes

Ce code n'est pas vraiment une preuve que cela est vrai. La citation habituelle est la suivante.

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