开关头中的变量声明?

Joh*_*itb 1 c++

在浏览我朋友的代码时,我注意到了这一点:

switch(State &state = getState()) {
case Begin: state = Search; break;
// other stuff similar
}
Run Code Online (Sandbox Code Playgroud)

交换机头中的变量是什么?他正在使用GCC,所以我认为这可能是GCC扩展.任何的想法?

Set*_*gie 9

这不是秘密或GCC扩展.允许变量在ifs,whiles和switches之类的条件下声明.例如:

while (char c = cin.get()) { ... }
Run Code Online (Sandbox Code Playgroud)

要么

if (int* something = (int*)malloc(4)) { // but don't use malloc in C++
    // ...
}
Run Code Online (Sandbox Code Playgroud)

在声明它们被初始化之后,它们被转换为bool值,并且如果它们评估到true块被执行,则跳过该块.它们的范围是它们被声明的条件的构造(并且在if范围内,范围也在所有else ifelse块上).

它说,在C++ 03标准的§6.4.1中

选择语句选择几个控制流之一.

selection-statement:

    if ( condition ) statement
    if ( condition ) statement else statement
    switch ( condition ) statement

condition:

    expression
    type-specifier-seq declarator = assignment-expression
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,它允许type-specifier-seq declarator = assignment-expression在一个if或多个条件下switch.你会在"重复结构"部分找到类似的东西.

此外,还可以处理可以隐式转换为整数或类型的类的switch整数或enum类型实例enum(第6.4.4节):

在switch语句中作为初始化声明的条件的值是声明变量的值(如果它具有整数或枚举类型),或者是隐式转换为整数或枚举类型的变量.

我实际上是从你在"C++的隐藏特性"问题上发表的答案中了解到这一点.所以我很高兴我能提醒你:)