【问题标题】:Why is it allowed to have a declaration without a name? [duplicate]为什么允许有没有名字的声明? [复制]
【发布时间】:2018-01-10 17:06:26
【问题描述】:

在阅读标准时,我真的很惊讶地发现,实际上,名称在声明中是可选的:

struct Magic {};
int main() {
  int; // well-formed
  Magic; // well-formed
}

对于那些有兴趣阅读标准的人来说,这是因为在 simple-declaration 中,init-declarator-list 是可选的。这是demo。

所以我真的很想知道为什么允许这样做。我为什么要那样做?这对我来说真的没有意义。我的理由是,如果没有意义,为什么要允许呢?

【问题讨论】:

  • @ChrisSprague 所以,“因为函数参数的语法相同,并且在那里很有用”?
  • @ChrisSprague 这很有道理。但是 parameter-declaration-clause 已经与 declator 一起使用了完全独立的语法(abstract-declarator)。我认为 declarator 没有必要这样做。
  • 用户定义的对象可以在构造函数/析构函数中做一些工作(例如创建数据库事务)。
  • -pedantic-errors 是你的朋友。
  • 那个演示没有显示它的格式正确。一方面,我认为 Clang 只声称符合 -pedantic。另一方面,GCC 和 Clang 都说警告算作诊断消息,并且格式错误代码的所有标准要求都是诊断(通常);如果需要,编译器仍然可以发出程序。

标签: c++ c++11 declaration definition


【解决方案1】:

根据 C++ 标准(7 个声明)

5 在 simple-declaration 中,可选的 init-declarator-list 可以是 仅在声明类(第 9 条)或枚举(7.2)时省略, 也就是说,当 decl-specifier-seq 包含 class-specifier,一个带有 class-key (9.1) 的 elaborated-type-specifier, 或 枚举说明符....

所以这段代码

int main() {
  int; // well-formed
  Magic; // well-formed
}

格式不正确。

此外,这些格式错误的声明在形式上是根据3.1 声明和定义节第 #2 段的定义,显然这样没有意义。

【讨论】:

  • 不错的一个。有趣的是,大多数人只是相信 OP 而没有尝试使用正确的标志编译代码。
  • 我在声明器中寻找类似的东西,没想到会出现在声明中:) 谢谢
  • 这个解释只到此为止,因为(应该是什么)init-declarator-list 可能没有被完全省略。 Rakete1111 对该问题的评论适用于这种情况,而是需要一个 declarator(而不是 abstract-declarator),它最终必须包含一个 id-expression 。例如,* 是一个有效的 abstract-declarator,但不是一个有效的 declarator,所以 int *; 不是一个有效的 simple-declaration .
猜你喜欢
  • 2018-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-20
  • 1970-01-01
相关资源
最近更新 更多