クラスが次のように定義されているとします
class A {
//.....
};
そして今、私は2つのオブジェクトを作成しています
A a,b;
a
とb
はどの順序で作成されますか?標準で定義されていますか?
8つの宣言から[dcl.decl] 3:
宣言内の各init-declaratorは、単独で宣言内にあるかのように個別に分析されます。
言い続ける
複数の宣言子を持つ宣言は通常、それぞれが単一の宣言子を持つ宣言の対応するシーケンスと同等です。つまり、
T D1, D2, ... Dn;
は通常T D1; T D2; ... T Dn;
と同等です。ここで、T
はdecl-specifier-seqで、各Di
はinit-declaratorです。宣言子の1つによって導入された名前がdecl-specifiersによって使用される型名を非表示にすると例外が発生します。したがって、同じdecl-specifiersが後続の宣言で使用される場合、それらは同じ意味を持ちません。
左から右に構築されていると言えます。
C++仕様の第8章[dcl.decl]、次のように述べています。
宣言内の各init-declaratorは、それ自体が宣言内にあるかのように個別に分析されます。 (100)
脚注(100)はさらに次のように述べています。
(100)複数の宣言子を持つ宣言は通常、それぞれが単一の宣言子を持つ対応する一連の宣言と同等です。あれは
T D1, D2, ... Dn;
通常と同等です
T D1; T D2; ... T Dn;
...そしていくつかの例外に名前を付けますが、そのような単純な場合には適用されません。
したがって、あなたの質問に対する答えは、オブジェクトはリストした順序で構築されるということです。いいえ、カンマ演算子ではありません。
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;
基準:
宣言子[dcl.decl]:
宣言内の各init-declaratorは、単独で宣言内にあるかのように個別に分析されます。
例:
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