11

次のコードは有効ですか? もしそうなら、の範囲はx何ですか?

int main()
{
   if (true) int x = 42;
}

私の直感では、if実際のブロック ( {}) が後に続くため、 によって作成されたスコープはありません。

4

2 に答える 2

25

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 トライブロック

于 2013-03-22T11:16:06.677 に答える
2

私のビジュアル スタジオによると、変数 x の有効期間はかなり短いとのことです。if 演算子の内部にいる間は、if 条件から外れると x は破棄され、このような変数を宣言する意味はまったくありません。

于 2013-03-22T11:20:09.947 に答える