在没有实际块的if块中有效的声明
Is a declaration valid inside an if block with no actual block?
以下代码有效吗?如果有,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) statementelse
statement
,,switch
() 声明才能strong>
和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块才能em>才能strong>才能em>才能em>才能em>才能em>才能em>才能em>
我的Visual studio说变量x的生命周期非常小当我们在操作符if里面的时候,所以当我们脱离它的状态时,x就会被摧毁,这是毫无意义的像这样声明变量
- 声明后,gcc 的动态大小数组是否与标准数组有效相同?
- 为什么别名声明不是有效的 init 语句(/simple-declaration)?
- 类外的前向声明有效,但在嵌套时无效
- 在 h 和 cpp 文件中单独声明和实现模板有时有效,有时会出现链接器错误
- 当程序从该函数调谐器时,指向在函数中声明和定义的某些 C 字符串的指针不再有效.为什么?
- 声明数组>> int arr[] 时出错;在C++(虽然在 Java 中有效)?
- 涡轮增压 这个声明“int fun-name(static int)”在C++中是否有效,为什么
- C - 一个函数声明,多个定义,并且仍然有效
- 这是有效的C++代码吗?(在声明范围之外使用本地类型)
- 此声明是否有效
- 静态常量声明,变量的constexpr定义,有效的c ++?
- 使用类型推断声明变量是否与"classical way"变量名称后用括号初始化变量一样有效?
- 是无定义的类声明,有效为模板参数
- "struct type variablename"声明有效吗?
- 为什么这个constconstconst声明有效
- 返回前向声明的枚举类是否有效?(Visual Studio 2015 链接器错误)
- 在循环范围之外声明参数是否更有效?
- 以下类型的声明是否完全有效
- 声明空堆栈的最有效方法是什么
- DFA构造函数错误,如何进行有效声明