【问题标题】:I believe this to be a (minor) defect in the C++11 Standard我认为这是 C++11 标准中的一个(次要)缺陷
【发布时间】:2014-11-22 19:09:13
【问题描述】:

我认为这是 C++11 标准中的一个(次要)缺陷。在 [dcl.dcl] 我们有:

简单声明

         decl-specifier-seqopt init-declarator-listopt ;

decl-specifier-seq 不能是可选的。

例如下面的 sn-p 不能编译:

x;

如果我在这里是正确的,那么第 8.3/1 段的开头也应该更改:

发件人:

声明符列表出现在可选项之后(第 7 条) decl-specifier-seq (7.1).

收件人:

声明符列表出现在 decl-specifier-seq (7.1) 之后。

【问题讨论】:

  • 既然我们无法更改标准,您希望我们怎么做?
  • @MikeW 我可能错了。
  • 谁认为这主要是基于意见的?
  • 顺便说一句,语法并不准确:“此 C++ 语法摘要旨在帮助理解。它不是该语言的准确陈述。特别是,这里描述的语法接受有效 C++ 结构的超集。"(附件 A)
  • 这里明显隐含的问题是“我正确吗?”。不要那么迂腐。

标签: c++ c++11 language-lawyer


【解决方案1】:

评论太长了

在第 7 条第 3 款中:

simple-declaration 中,可选的 init-declarator-list 可以是 仅在声明类(第 9 条)或枚举(7.2)时省略, 也就是说,当 decl-specifier-seq 包含 class-specifier,一个带有 class-key (9.1) 的 elaborated-type-specifier, 或一个 enum-specifier 在这些情况下以及每当一个 class-specifierenum-specifier 存在于 decl-specifier-seq 中,标识符 在这些说明符中是由 声明(如 class-namesenum-namesenumerators,取决于 语法)。在这种情况下,除了声明 未命名位域 (9.6),decl-specifier-seq 应引入一个或 更多的名字进入程序,或者应该重新声明一个由一个引入的名字 之前的声明。

在第 7 条第 9 段中

仅在构造函数、析构函数和类型的函数声明中 decl-specifier-seq 可以省略。

【讨论】:

  • 这并不是说声明中缺少类型。
  • @DieterLücking 不,您用粗体表示在哪些情况下可以省略 init-declarator-list,而不是在这种情况下省略 decl-specifier-seq 可以省略。
  • 脚注 89 说 The “implicit int” rule of C is no longer supported.
  • 第二部分(但只有第二部分)对我来说似乎是一个正确的答案。 :)
  • 我同意@hvd。第二部分似乎是答案。第一部分(第 3 段)与此无关。
猜你喜欢
  • 2012-05-22
  • 2011-03-12
  • 2019-01-22
  • 2014-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-09
  • 2014-11-27
相关资源
最近更新 更多