次のコードは有効ですか? もしそうなら、の範囲はx
何ですか?
int main()
{
if (true) int x = 42;
}
私の直感では、if
実際のブロック ( {}
) が後に続くため、 によって作成されたスコープはありません。
次のコードは有効ですか? もしそうなら、の範囲はx
何ですか?
int main()
{
if (true) int x = 42;
}
私の直感では、if
実際のブロック ( {}
) が後に続くため、 によって作成されたスコープはありません。
GCC 4.7.2 は、コードはvalid ですが、のスコープx
は依然として条件付きであることを示しています。
これは、に起因するものです:
[C++11: 6.4/1]:
[..] selection-statement内のサブステートメント (ステートメントのelse
形式の各サブif
ステートメント) は、暗黙的にブロック スコープを定義します。[..]
したがって、コードは次と同等です。
int main()
{
if (true) {
int x = 42;
}
}
選択ステートメントの生成は次のようになるため、文法的には有効です[C++11: 6.4/1]
(by ):
選択ステートメント:
if
(条件)ステートメント
if
(条件)ステートメントelse
ステートメント
switch
(条件)ステートメント
とint x = 42;
はステートメントです( by [C++11: 6/1]
):
statement :
ラベル付きステートメント
属性指定子シーケンスopt 式ステートメント
属性指定子シーケンスopt 複合ステートメント
属性指定子シーケンスopt 選択ステートメント
属性指定子シーケンスopt 繰り返しステートメント
属性指定子シーケンスopt ジャンプステートメント
宣言ステートメント
属性指定子シーケンスopt トライブロック
私のビジュアル スタジオによると、変数 x の有効期間はかなり短いとのことです。if 演算子の内部にいる間は、if 条件から外れると x は破棄され、このような変数を宣言する意味はまったくありません。