次のコードは有効ですか? もしそうなら、の範囲は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 は破棄され、このような変数を宣言する意味はまったくありません。