“f();”怎么能成为下面的声明
How can `f();` be a declaration below?
摘
自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-声明解析。
相关文章:
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 声明C++具有动态大小的数组类型在 Linux 中工作正常,但不能在 Windows 中工作
- 错误:不能使用"显式"说明符声明 bool'
- 为什么不能用常量表达式声明数组?
- 为什么我在声明对象数组时不能使用 -> 运算符?
- C++为什么类成员函数不能重新声明,但普通函数可以
- 为什么我们不能在声明之前使用预处理器 #define 常量
- C++:为什么'this'不能成为 nullptr?
- OpenGL不能成为一个完美的立方体
- SFINAE :不能重新声明类成员
- C++:静态成员不能在声明时定义,但静态函数变量可以?
- 为什么Main不能成为ConstexPr
- 如果 npos 为 -1,size_type怎么能成为无符号积分
- “f();”怎么能成为下面的声明
- 为什么我不能转发声明指针结构?
- 为什么 GCC 不能使用声明为正确的类型解决此问题
- 为什么我不能转发声明内部友元类?
- 如何查找不能成为 Unicode 字符串中单词一部分的字符
- 为什么我不能转发声明类型定义?
- 成员函数模板不能被声明为虚函数-摘自Addison Wesley: c++模板