Если два объекта объявлены в одной строке, в каком порядке они сконструированы?

Скажем, класс был определен как

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

и теперь я создаю два объекта как

A a,b;

В каком порядке создаются a и b? Определяется ли это стандартом?

Ответ 1

От 8 Declarators [dcl.decl] 3:

Каждый init-declarator в декларации анализируется отдельно, как если бы он был в декларации сам по себе.

Далее говорится

Объявление с несколькими деклараторами обычно эквивалентно соответствующей последовательности объявлений, каждая с одним описатель. То есть T D1, D2, ... Dn;обычно эквивалентен T D1; T D2; ... T Dn;где T является спецификатором-указателем-seq, и каждый Di является init-declarator. Исключение возникает, когда имя, введенное одним из деклараторы скрывают имя типа, используемое спецификаторами decl, так что, когда одни и те же спецификаторы объявлений используются в следующем декларации, они не имеют того же значения.

Можно сказать, что они построены слева направо.

Ответ 2

С++ spec Chapter 8 [dcl.decl], говорит:

Каждый init-declarator в декларации анализируется отдельно, как если бы он был в декларации сам по себе. (100)

Далее идет сноска (100):

(100) Декларация с несколькими деклараторами обычно эквивалентна соответствующая последовательность объявлений, каждая с одним декларатором. Это

T D1, D2, ... Dn;

обычно эквивалентен

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

... и затем называет некоторые исключения, ни одна из которых не применяется в таких простых случаях.

Итак, ответ на ваш вопрос заключается в том, что объекты построены в том порядке, в котором вы их перечисляете. И нет, это не оператор запятой.

Ответ 3

Порядок - это письменный порядок слева направо. Кроме того, это не оператор запятой, а просто список деклараторов. Когда используется пользовательский оператор запятой, порядок фактически не указан.

См. оператор запятой и declarators.

Ответ 4

Сначала будет создан

a, а затем b.

Запятые в этом случае будут использоваться как разделители, а не как операторы.

Например, из википедии:

    /**
      *  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;

Ответ 5

Стандарты:

Declarators [dcl.decl]:
Каждый декларатор init в декларации анализируется отдельно, как если бы он был в декларации сам по себе.

Пример:

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

Вывод:

I am a
I am b