if语句的一个分支不能只是一个声明吗?

Hua*_*-zh 2 c++ syntax grammar if-statement

if语句的一个分支不能只是一个声明.如果我们需要在分支中引入一个名称,它必须被包含在一个块中.------由TC++ PL 4th.

void f1(int i)
{
    if (i)
        int x = i + 2;        //error: declaration of if-statement branch
}
Run Code Online (Sandbox Code Playgroud)

但它对VS2013和GCC4.8的编译器有意义.

工作草案(N3242)向我展示了这一点

如果selection-statement中的子语句是单个语句而不是复合语句,则就好像它被重写为包含原始子语句的复合语句一样.

代码可以等效地重写为:

void f1(int i)
{
    if (i) {
        int x = i + 2;
    }
}
Run Code Online (Sandbox Code Playgroud)

因此在if语句之后,x不再在范围内.

那么标准是什么?

Kei*_*son 6

从语法上讲,声明可以是一个声明.具体来说,这是一个声明声明.

(我说"可以",因为并非所有声明都是语句.例如,文件范围内的声明,声明不能合法出现,不是声明.)

由于if语句的语法是:

if ( condition ) statement
Run Code Online (Sandbox Code Playgroud)

要么

if ( condition ) statement else statement
Run Code Online (Sandbox Code Playgroud)

if声明的任何一个分支都是一个声明是完全合法的.

在您的示例中,它不是特别有用,但我可以很容易地想象您可能想要声明一个对象以执行其构造函数和/或析构函数.

if语句的一个分支不能只是一个声明.如果我们需要在分支中引入一个名称,它必须被包含在一个块中.------由TC++ PL 4th.

我有一份PDF格式的"The C++ Programming Language",第4版,第4版,日期为2015年4月.9.3中的声明"声明是声明".还在那里.该陈述不正确,或至少不完整.声明:

if语句的一个分支不能只是一个声明.如果我们需要在分支中引入名称,则必须将其括在一个块中.

不再存在; 它已更新为:

if语句的分支声明的范围就是该分支.如果我们需要在分支中引入名称,则必须将其括在一个块中(第9.2节).

这不是严格正确的,但是如果你想在分支中声明一个声明,如果你想在一个声明中引用它,你需要将它包含在一个块中.仅包含声明的分支是合法的,但通常没用.

(顺便提一下,C有不同的规则.自1999年标准以来,C允许混合声明和语句,但它不将声明视为语句,所以在C中,声明不能if语句的一个分支.)