`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-seq 在 simple-declaration 生产中成为必需的,并创建一个单独的 nodeclspec-function-declaration 生产不是 [=28=]block-declaration 对于没有 decl-specifier-seq 的情况,因此 f();
as-an-ill-formed-declaration 解析不再可能在 复合语句 .
中
摘自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-seq 在 simple-declaration 生产中成为必需的,并创建一个单独的 nodeclspec-function-declaration 生产不是 [=28=]block-declaration 对于没有 decl-specifier-seq 的情况,因此 f();
as-an-ill-formed-declaration 解析不再可能在 复合语句 .