在没有实际块的if块中有效的声明

Is a declaration valid inside an if block with no actual block?

本文关键字:有效 声明 if      更新时间:2023-10-16

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

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

我的直觉告诉我,if没有创建作用域,因为没有实际的块({})跟随它。

GCC 4.7.2告诉我们,虽然代码有效,但x的作用域仍然是简单的条件。

范围

这是因为:

[C++11: 6.4/1]: […]选择语句中的子语句(每个子语句,在if语句的else形式中)隐式地定义了一个块范围。 [. .]

因此,您的代码相当于以下内容:
int main()
{
   if (true) {
      int x = 42;
   }
}

有效性

就语法而言是有效的,因为选择语句的生成是这样的(通过[C++11: 6.4/1]):

selection-statement :
<才能strong> if () 声明
,,if (condition) statement else statement
,,switch () 声明

int x = 42;是一个语句(由[C++11: 6/1]):

声明:
<才能em>标记语句
<才能em> attribute-specifier-seq <子>选择表达式语句
<才能em> attribute-specifier-seq <子>选择复合语句
<才能em> attribute-specifier-seq <子>选择 selection-statement
<才能em> attribute-specifier-seq <子>选择迭代语句
<才能em> attribute-specifier-seq <子>选择跳转语句
<才能strong>说明语句
<才能em> attribute-specifier-seq <子>选择 try块

我的Visual studio说变量x的生命周期非常小当我们在操作符if里面的时候,所以当我们脱离它的状态时,x就会被摧毁,这是毫无意义的像这样声明变量