Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么不同类型的变量声明表示不同的实体_C++_Language Lawyer - Fatal编程技术网

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

C++ 为什么不同类型的变量声明表示不同的实体,c++,language-lawyer,C++,Language Lawyer,以下代码未编译: #include <iostream> #include <stdio.h> extern int a; extern char a; int main(){ std::cout << a;} #包括 #包括 外部内部a; 外部字符a; int main(){std::cout[basic]/3 实体是值、对象、引用、函数、枚举数、类型, 类成员、模板、模板专门化、命名空间、参数 打包,或此 /六, 变量是通过声明非静态数据成员或对象以

以下代码未编译:

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

extern int a;
extern char a;

int main(){ std::cout << a;}
#包括
#包括
外部内部a;
外部字符a;
int main(){std::cout[basic]/3

实体是值、对象、引用、函数、枚举数、类型, 类成员、模板、模板专门化、命名空间、参数 打包,或

/六,

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

两个声明
extern int a;
extern char a;
都声明了一个变量。在第一种情况下,名称
a
指的是
int
类型的对象实体,在第二种情况下,名称
char
类型的对象实体

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

仍然存在类型双关的问题,但我认为这只会产生一个类型与它所指对象不同的表达式。我认为不可能(=允许)产生一个有两种类型的对象,我将[intro.object]/1中的“对象有一种类型”解释为“一个对象只有一种类型”

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

3.5/10:

在所有类型调整之后(在此期间,typedefs(7.1.3)被其定义所取代),引用给定变量或函数的所有声明所指定的类型应相同


因此,您可以有两个相同变量的声明(一个变量是一个实体)使用不相同的类型,或者使用相同名称的两个不同变量。不管怎样,这都是一个错误。

这不清楚;编译错误与类型无关,只是您重新定义了符号
a
。对于
int a=5;int a=7;
@OliCharlesworth,我为这个输入错误感到抱歉。我已经为您解决了“我的意思是我们考虑重新声明而不是定义A。当然,ODR可以被应用……还不清楚这与类型有什么关系。<代码> Extn int a=5;Extn int a=7;< /Calp>也不会编译。@我猜这里的每个人都同意问题是相同的,答案是appli。是的。我不明白你在哪里看到了差异。请解释。啊,太好了,这是我答案中缺失的一部分;)关于对象的非常有趣的信息。我跳过了标准中的第一条。这是毫无意义的。但我不明白为什么我们不能推理它作为一种无效的语言结构“只有函数和函数模板声明可以重载”?我同意13/1也禁止重载(即,我不同意david.pfx),但是我认为在前面关于声明、范围和名称查找的一节中有一个答案。