web-dev-qa-db-ja.com

2つのオブジェクトが1行で宣言されている場合、どの順序で構築されますか?

クラスが次のように定義されているとします

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

そして今、私は2つのオブジェクトを作成しています

A a,b;

abはどの順序で作成されますか?標準で定義されていますか?

63
pasha

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が後続の宣言で使用される場合、それらは同じ意味を持ちません。

左から右に構築されていると言えます。

78
erip

C++仕様の第8章[dcl.decl]、次のように述べています。

宣言内の各init-declaratorは、それ自体が宣言内にあるかのように個別に分析されます。 (100)

脚注(100)はさらに次のように述べています。

(100)複数の宣言子を持つ宣言は通常、それぞれが単一の宣言子を持つ対応する一連の宣言と同等です。あれは

T D1, D2, ... Dn;

通常と同等です

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

...そしていくつかの例外に名前を付けますが、そのような単純な場合には適用されません。

したがって、あなたの質問に対する答えは、オブジェクトはリストした順序で構築されるということです。いいえ、カンマ演算子ではありません。

52
Nemo

順序は、左から右への書面による順序です。また、カンマ演算子ではなく、単なる宣言子のリストです。ユーザー定義のカンマ演算子を使用する場合、実際には順序は指定されていません。

コンマ演算子 および 宣言子 を参照してください。

11
Yam Marcovic

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;
8
Pritam Banerjee

基準:

宣言子[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
6
Andreas DM