【问题标题】:C++ standard ambiguityC++ 标准歧义
【发布时间】:2015-10-21 15:43:05
【问题描述】:

据我在标准中看到的,以下代码是有效的。它在 MSVC1025 中编译。

const struct omg;
struct omg volatile;

int main()
{
    return 0;
}

在这些声明中,限定词 constvolatile 似乎毫无意义。它们既不会帮助也不会伤害编译器和程序员。

该标准似乎并不打算清除这些“空洞的歧义”。对于空声明;,它是明确允许的。

是否存在其他经过预处理后与表达式含义无关的标记情况?

【问题讨论】:

  • 我不会认为 MSVC 是标准允许或要求的可靠仲裁者。而且我倾向于怀疑情况会在 11025 年发生变化 :-)
  • 在标准中哪里可以找到与“只能为对象和函数指定限定符?这是 g++ 错误消息。
  • "after preprocessing" 并不意味着您的问题似乎暗示了什么。 After preprocessing 意味着:当预处理器完成时。

标签: c++ language-lawyer


【解决方案1】:

clanggcc 都使用 -pedantic-errors 拒绝此代码。 clang 提供以下错误:

error: 'const' is not permitted on a declaration of a type [-Werror,-Wmissing-declarations]
const struct omg;
^

error: 'volatile' is not permitted on a declaration of a type [-Werror,-Wmissing-declarations]

C++ 标准草案第 7.1.6.1 节 cv-qualifiers [dcl.type.cv] 说:

[...]如果 cv-qualifier 出现在 decl-specifier-seq 中,则声明的 init-declarator-list 应 不能为空。[...]

【讨论】:

  • 我赞成并接受了您的回答,即使它没有按照措辞回答我的问题。我一直在寻找不相关的东西,例如 if(true);,它们既不是完整的表达式,也不依赖于其他声明/表达式。
  • @Hector 我完全错过了您问题的这一方面,我从更狭义的角度阅读。您可能会收到更广泛的答案,这并不罕见。与此同时,您应该随意不接受,没有接受的问题通常会获得更多的观点,有时会得到更多的答案,我会完全理解。
  • @Hector 一般而言,标准避免了歧义,并且要么使此类情况不正确或未定义行为。在其他情况下,标准将定义应如何解决歧义。这是有道理的,因为标准的目标之一是消除潜在的歧义并提供统一的实现。
猜你喜欢
  • 2020-11-26
  • 1970-01-01
  • 2010-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多