为什么声明具有不同类型的变量表示不同的实体

时间:2014-05-31 19:44:40

标签: c++ language-lawyer

以下代码无法编译:

#include <iostream>
#include <stdio.h>

extern int a;
extern char a;

int main(){ std::cout << a;}

据我了解,这是因为在同一声明区域中有两个a声明表示不同的实体。这似乎很明显。

但标准在哪里说这两个实体是不同的?我已经阅读了3.1-3.4部分但却无法找到任何内容。

你能找到明确或暗示不允许这样做的引用吗?

2 个答案:

答案 0 :(得分:1)

3.5 / 10:

  

在对类型进行所有调整之后(其中typedefs(7.1.3)被其定义替换),引用给定变量或函数的所有声明指定的类型应相同

因此,要么具有相同变量的两个声明(变量是实体),要么具有不相同的类型,要么具有两个具有相同名称的不同变量。无论哪种方式都是错误的。

答案 1 :(得分:0)

[基本] / 3

  

实体是一个值,对象,引用,函数,枚举器,类型,   类成员,模板,模板特化,命名空间,参数   打包,或this

/ 6

  

变量是由非静态数据成员或对象以外的引用声明引入的。变量的名称表示引用或对象。

两个声明extern int a;extern char a;都声明了一个变量。第一种情况下的名称a引用类型为int的对象的实体,而第二种情况下引用的实体是char类型的对象。< / p>

对象的类型为[intro.object] / 1。由两个a表示的对象具有不同的类型,因此它们不是相同的对象(字面意思)。

仍然存在类型惩罚的问题,但我认为只生成一个类型与其引用的对象不同的表达式。我不认为有可能(=允许)生成一个有两种类型的对象,我在[intro.object] / 1中解释为“一个对象有一个类型”,因为“一个对象只有一种类型”。

我认为可以安全地从这里得出结论,不同类型的两个对象是不同的对象,因此不同的实体