質問

struct Point {
  int x = 0;
  int y = 10;
};

Point p = {1,};
p.x == 1;  // true
p.y == 10; // is this true?

標準に従って、初期化子リスト内の欠落要素は値が初期化されるため、 y あるべきです int() または 0, しかし、Non-static Data Member Initializer の状況で何が起こるかは書かれていないようです。

編集:回答によると、これはc ++ 11では無効であるようですが、c ++ 1yでは状況が知りたいです。

役に立ちましたか?

解決

C++98、C++03

非静的データ メンバー初期化子 (NSDMI) は存在しません。質問は当てはまりません。


C++11

まず第一に、型が集合体ではないため、この初期化は無効です。

[C++11: 8.5.1/1]: 集合体とは、 配列または クラス (第9条) ユーザー提供のコンストラクター (12.1)、 いいえ ブレースオアイコールイニシャライザ 非静的データメンバーの場合 (9.2)、プライベートまたは保護された非静的データメンバー(条項11)、基本クラス(条項10)、および仮想関数(10.3)なし。

したがって、ここでは集約の初期化を実行できません。を受け取るコンストラクター std::initializer_list それがその初期化構文を使用する唯一の方法です([C++11: 8.5.4/3])、しかしあなたはそれらのいずれかを持っていません。

したがって、質問の前提全体に欠陥があります。この状態になることは不可能です。


C++1y

標準の次期バージョンでは、集計の定義が緩和され、型が 集計 (メンバー二人がいる限り) public!):

[n3936: 8.5.1/1] 集合体とは、 配列または クラス ユーザー提供のコンストラクター (12.1) を使用しない (9 節)、 プライベートまたは保護された非静的データ メンバーはありません (第 11 節)、基本クラスはありません (第 10 節)、仮想関数はありません (第 10.3 節)。

これに続いて、探している結果を保証するルールがあります。

[n3936: 8.5.1/7]:少ない場合 初期化句 集合体のメンバーよりもリスト内にある場合、明示的に初期化されていない各メンバーは、そのメンバーから初期化されます。 ブレースオアイコール初期化子 または、存在しない場合は、 ブレースオアイコール初期化子、空の初期化リストから(8.5.4)。 [ 例:

struct S { int a; const char* b; int c; int d = b[a]; };
S ss = { 1, "asdf" };

初期化します ss.a1, ss.b"asdf", ss.c 次の形式の式の値を使用して int{} (あれは、 0)、 そして ss.d の値で ss.b[ss.a] (あれは、 ’s’)、そして

struct X { int i, j, k = 42; };
X a[] = { 1, 2, 3, 4, 5, 6 };
X b[2] = { { 1, 2, 3 }, { 4, 5, 6 } };

a そして b 同じ値を持っています —終わりの例]

他のヒント

のみ!)

セクション「8.5.1集計」の段落番号7によると(ワーキングドラフトN3691日付:2013-05-16)

7リスト内の初期化句がある場合は、 集計内のメンバー、次に各メンバーは明示的に初期化されていません ブレースまたは等しいイニシャライザから初期化され、またはあれば 空の初期化子リストから、ブレースまたは等直なものはありません (8.5.4)

と引用下の下には

があります
[ Example: struct S { int a; const char* b; int c; int d = b[a]; }; 
S  ss = { 1, "asdf" };
 initializes ss.a with 1, ss.b with "asdf", ss.c
with the value of an expression of the form int{} (that is, 0), and
ss.d with the value of ss.b[ss.a] (that is, ’s’),
.

SOの例では、P.Yは10で初期化されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top