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

Допустим, класс был определен как

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

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

A a,b;

В каком порядке a а также b создан? Это определяется стандартом?

63

Решение

Из 8 деклараторов [dcl.decl] 3:

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

Это продолжает говорить

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

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

78

Другие решения

Глава 8 спецификации C ++ [dcl.decl] гласит:

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

Сноска (100) продолжает:

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

T D1, D2, ... Dn;

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

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

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

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

52

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

Увидеть оператор запятой а также declarators.

11

будет создан сначала, а затем б.

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

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

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

Стандарты:

Заявители [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
6
По вопросам рекламы [email protected]