Als twee objecten op één regel worden gedeclareerd, in welke volgorde worden ze dan geconstrueerd?

Stel dat een klasse is gedefinieerd als

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

en nu maak ik twee objecten als

A a,b;

In welke volgorde worden aen bgemaakt? Wordt het gedefinieerd door de standaard?


Antwoord 1, autoriteit 100%

Van 8 Aangevers [dcl.decl] 3:

Elke init-declarator in een aangifte wordt afzonderlijk geanalyseerd alsof het een afzonderlijke aangifte is.

Het gaat verder met te zeggen

Een aangifte met meerdere aangevers is meestal gelijk aan de overeenkomstige reeks aangiften, elk met een enkele
aangever. Dat is
T D1, D2, ... Dn;
is meestal gelijk aan
T D1; T D2; ... T Dn;
waarbij Teen decl-specifier-seq is en elke Dieen init-declarator is. Een uitzondering treedt op wanneer een naam geïntroduceerd door een van
de declarators verbergt een typenaam die wordt gebruikt door de decl-specificaties, zodat wanneer dezelfde decl-specificaties worden gebruikt in een volgende
verklaring hebben, hebben ze niet dezelfde betekenis.

Je kunt zeggen dat ze van links naar rechts zijn opgebouwd.


Antwoord 2, autoriteit 67%

C++ spec hoofdstuk 8 [dcl.decl], zegt:

Elke init-declaratorin een aangifte wordt afzonderlijk geanalyseerd alsof het
stond op zichzelf in een verklaring. (100)

Voetnoot (100) zegt verder:

(100) Een aangifte met meerdere aangevers is meestal gelijk aan de
overeenkomstige reeks aangiften elk met een enkele declarator.
Dat is

T D1, D2, ... Dn;

is meestal gelijk aan

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

…en noemt dan enkele uitzonderingen, die geen van allen van toepassing zijn in zulke eenvoudige gevallen.

Dus het antwoord op je vraag is dat de objecten zijn geconstrueerd in de volgorde waarin je ze opsomt. En nee, het is geen komma-operator.


Antwoord 3, autoriteit 14%

De volgorde is de schriftelijke volgorde, van links naar rechts. Het is ook niet de komma-operator, maar gewoon een lijst met declarators. Wanneer een door de gebruiker gedefinieerde komma-operator wordt gebruikt, is de volgorde in feite niet gespecificeerd.

Zie komma-operatoren declarators.


Antwoord 4, autoriteit 10%

awordt eerst gemaakt en daarna b.

Komma’s worden in dit geval als scheidingstekensgebruikt en niet als operatoren.

Bijvoorbeeld van 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;

Antwoord 5, autoriteit 8%

Normen:

Aangevers [dcl.decl]:
Elke init-declarator in een aangifte wordt afzonderlijk geanalyseerd alsof het op zichzelf in een aangifte zit.

Voorbeeld:

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");
}

Uitvoer:

I am a
I am b

Other episodes