声明在没有实际块的if块内有效吗?

时间:2013-03-22 11:14:48

标签: c++ language-lawyer

以下代码是否有效?如果是这样,x的范围是什么?

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

我的直觉说if没有创建范围,因为没有实际的块({})跟随它。

2 个答案:

答案 0 :(得分:25)

GCC 4.7.2向我们展示了,虽然代码有效the scope of x is still simply the conditional

范围

这是由于:

  

[C++11: 6.4/1]: [..] selection-statement 中的子语句(每个子语句,else形式的{{1} })语句隐式定义块范围。 [..]

因此,您的代码等同于以下内容:

if

有效期

语法上的有效因为选择语句的生成因此(int main() { if (true) { int x = 42; } } ):

  

选择语句
   [C++11: 6.4/1]条件声明
  if条件声明 if 声明
  else条件声明

switch语句int x = 42;}):

  

语句
  标记的语句
   attribute-specifier-seq opt expression-statement
   attribute-specifier-seq opt 复合语句
   attribute-specifier-seq opt selection-statement
   attribute-specifier-seq opt iteration-statement
   attribute-specifier-seq opt jump-statement
  的 声明陈述
   attribute-specifier-seq opt try-block

答案 1 :(得分:2)

我的Visual Studio说变量x的生命时间非常小 - 就在我们进入运营商的时候, 因此,当我们处于条件之外时,x将被销毁,并且绝对没有任何意义 声明这样的变量。