【问题标题】:C++ standard definition of conflicting declarations冲突声明的 C++ 标准定义
【发布时间】:2018-01-20 10:36:35
【问题描述】:

标准在哪里定义了冲突声明?

例如,如果我在命名空间范围内有以下声明:

extern const int a;
extern int a;

这将是一个冲突声明的例子。

【问题讨论】:

  • 既然你的问题是“哪里?”,答案就在这里:[basic.scope]
  • @Oliv 好的,也许我在问题中的措辞是错误的。在提出这个问题之前,我阅读了您链接的部分内容,但我找不到任何明确的内容。您能否引用标准说重新声明必须就类型或类似内容达成一致?谢谢!
  • basic.def/1 一个声明可以在翻译单元中引入一个或多个名称,或者重新声明先前声明引入的名称。如果是这样,则声明指定这些名称的解释和属性您可以通过重新声明来指定解释和属性,但您不能更改已经指定的内容。 (这里你正在改变类型)
  • 一些可能有帮助的相关注释:C 有“兼容类型”的概念,并明确表示引用同一对象的声明应具有兼容类型,但 C++ 没有。此外,还有一些特殊情况,允许对同一实体进行不同类型的声明。例如,int[]int[N]
  • Yes.

标签: c++ language-lawyer declaration


【解决方案1】:

根据[dcl.type]cv-qualifierconst是类型的一部分,因此const int x;int x;构成变量x的不同声明。

然后我们到达[over]/1,它声明:

当为同一范围内的单个名称指定两个或多个不同的声明时,该名称称为重载。通过扩展,在同一范围内声明相同名称但具有不同类型的两个声明称为重载声明。只能重载函数和函数模板声明;变量和类型声明不能重载。

【讨论】:

  • 非常感谢。我整天都在努力在标准中找到类似的东西,但我没想到在“重载”部分中寻找它。但是,@xskxzr 引用的basic.types 中的例子有点矛盾,不是吗?
  • 那么有什么不同的声明呢?例如,extern inline int a;extern int a; 不同吗?
  • 有人告诉我存在另一个段落,其中还包括关于有/无绑定数组的异常:basic.link/11