“f();”怎么能成为下面的声明

How can `f();` be a declaration below?

本文关键字:能成为 声明      更新时间:2023-10-16

自DR 1990:

在类似的例子中

void f() {
    f();  // #1
}

#1 处的语句不明确,可以解析为表达式或声明。

这基本上是语法编写方式的技术问题。没有一个理智的供应商会在这里报告歧义。

在 C++14 及更早版本中,我们有一个简单的声明,其中包括:

decl-specifier-seq opt init-declarator-listopt ;

请注意,decl-specifier-seq 是可选的。

然后我们有一个语义要求,即 decl-specifier-seq 只能在构造函数、析构函数或转换函数声明中省略,但这不会影响解析。

简单声明是块声明,块声明是

声明语句,因此净效果是复合语句,例如

{
    f();
}

f();可以解析为由没有 decl-specifier-seq 的(格式不正确的)简单声明组成的声明语句,也可以解析为表达式语句

DR1990 更改使得 decl-specifier-seq简单声明生产中是必需的,并创建了一个单独的 nodeclspec-function-声明生产,该生产不是 no decl-specifier-seq 案例的声明,因此在复合语句中不再可能f(); as-ano-form-form-声明解析。