`f();` 如何成为下面的声明?

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

摘自DR 1990

In an example like

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

The statement at #1 is ambiguous and can be parsed as either an expression or as a declaration.

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

在 C++14 及更早版本中,我们有一个 简单声明 ,除此之外,

decl-specifier-seqopt init-declarator-listopt ;

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

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

一个简单声明是一个块声明,一个块声明是一个 声明语句 ,所以最终效果是 复合语句 就像

{
    f();
}

f(); 可以被解析为 声明语句 由(格式错误的) 简单声明 组成没有 decl-specifier-seq,或作为 expression-statement.

DR1990 更改使得 decl-specifier-seqsimple-declaration 生产中成为必需的,并创建一个单独的 nodeclspec-function-declaration 生产不是 [​​=28=]block-declaration 对于没有 decl-specifier-seq 的情况,因此 f(); as-an-ill-formed-declaration 解析不再可能在 复合语句 .