13

質問のタイトルはそれをすべて示しています:フォームの宣言にint a = 0, b = aは未定義の動作がありますか?

4

2 に答える 2

12

いいえ、これは明確に定義されています。これは、2つの宣言子とを含む宣言aですb。各宣言子には初期化子があります。

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

つまり、行は次のように扱われます。

int a = 0;
int b = a;
于 2013-03-12T20:37:30.270 に答える
8

いいえ、未定義動作はありません

C ++ 11標準のパラグラフ8/3による:

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

また、脚注97で指定されているように:

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

T D1, D2, ... Dn;

通常(*)と同等です

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

これは、a最初に初期化され、次にb初期化され、の値を想定することを意味しますa。また、そうでない場合でも、これがUBであるかどうかについて、SOについてかなり長い議論があり、これがUBではないことについてある程度のコンセンサスが得られていることにも注意してください。


(*):コメントでOlaf Dietscheが説明しているように、この同等性が成り立たない状況については、同じ脚注で後述します。

于 2013-03-12T20:42:01.883 に答える