Скажем, класс был определен как
class A {
//.....
};
и теперь я создаю два объекта как
A a,b;
В каком порядке создаются a
и b
? Определяется ли это стандартом?
Скажем, класс был определен как
class A {
//.....
};
и теперь я создаю два объекта как
A a,b;
В каком порядке создаются a
и b
? Определяется ли это стандартом?
От 8 Declarators [dcl.decl] 3:
Каждый init-declarator в декларации анализируется отдельно, как если бы он был в декларации сам по себе.
Далее говорится
Объявление с несколькими деклараторами обычно эквивалентно соответствующей последовательности объявлений, каждая с одним описатель. То есть
T D1, D2, ... Dn;
обычно эквивалентенT D1; T D2; ... T Dn;
гдеT
является спецификатором-указателем-seq, и каждыйDi
является init-declarator. Исключение возникает, когда имя, введенное одним из деклараторы скрывают имя типа, используемое спецификаторами decl, так что, когда одни и те же спецификаторы объявлений используются в следующем декларации, они не имеют того же значения.
Можно сказать, что они построены слева направо.
С++ spec Chapter 8 [dcl.decl], говорит:
Каждый init-declarator в декларации анализируется отдельно, как если бы он был в декларации сам по себе. (100)
Далее идет сноска (100):
(100) Декларация с несколькими деклараторами обычно эквивалентна соответствующая последовательность объявлений, каждая с одним декларатором. Это
T D1, D2, ... Dn;
обычно эквивалентен
T D1; T D2; ... T Dn;
... и затем называет некоторые исключения, ни одна из которых не применяется в таких простых случаях.
Итак, ответ на ваш вопрос заключается в том, что объекты построены в том порядке, в котором вы их перечисляете. И нет, это не оператор запятой.
Порядок - это письменный порядок слева направо. Кроме того, это не оператор запятой, а просто список деклараторов. Когда используется пользовательский оператор запятой, порядок фактически не указан.
См. оператор запятой и declarators.
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;
Стандарты:
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