D
の別の部分に基づいての一部を初期化する次のコードを考えてみますD
。
struct c {
c() : D{rand(), D[0]} {}
int D[2];
};
int main() {
c C;
assert(C.D[0] == C.D[1]);
}
上記のプログラムは適切に定義されていますか? 同じ配列の一部を使用して別の部分を安全に初期化できますか?
ベストアンサー1
集合体 (配列を含む) が中括弧付きリストから初期化される場合、集合体の各要素はリストの対応する要素から初期化されます (「増加した添え字またはメンバーの順序で」)。各要素の初期化が前の要素の後に順序付けられるという正確なルールは見つかりませんが、標準には、これが意図された意味であることを明確に示す例があります。例は [dcl.init.aggr] にあります。
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’