部分的な集約初期化と非静的データ メンバー初期化子
質問
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.a
と1
,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で初期化されます。