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