以下代码无法编译:
#include <iostream>
#include <stdio.h>
extern int a;
extern char a;
int main(){ std::cout << a;}
据我了解,这是因为在同一声明区域中有两个a
声明表示不同的实体。这似乎很明显。
但标准在哪里说这两个实体是不同的?我已经阅读了3.1-3.4部分但却无法找到任何内容。
你能找到明确或暗示不允许这样做的引用吗?
答案 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中解释为“一个对象有一个类型”,因为“一个对象只有一种类型”。
我认为可以安全地从这里得出结论,不同类型的两个对象是不同的对象,因此不同的实体。