Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/28.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.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+中的声明和定义+;_C++_Language Lawyer - Fatal编程技术网

C++ c+中的声明和定义+;

C++ c+中的声明和定义+;,c++,language-lawyer,C++,Language Lawyer,我认为每个声明都是定义,因为标准中有以下引用: 声明是一种定义,除非%restrictions% 但我的假设是不正确的。实际上,应用ODR,我们有以下程序 class A; class A; int main(){ } 他身体不好。但事实并非如此。我找不到允许在声明区域重新声明类类型的部分标准。是,“声明是一个定义,除非%restrictions%”为真。你读过限制吗?其中之一是: 它是一个类名声明 SoA类不是一个定义,因为它包含在一个限制中 只是想澄清一下,引用C++11,[basic.

我认为每个声明都是定义,因为标准中有以下引用:

声明是一种定义,除非%restrictions%

但我的假设是不正确的。实际上,应用ODR,我们有以下程序

class A;
class A;

int main(){ }
他身体不好。但事实并非如此。我找不到允许在声明区域重新声明类类型的部分标准。

是,“声明是一个定义,除非%restrictions%”为真。你读过限制吗?其中之一是:

它是一个类名声明

So
A类不是一个定义,因为它包含在一个限制中

只是想澄清一下,引用C++11,
[basic.def]§2

是,“声明是一个定义,除非%restrictions%”是真的。你读过限制吗?其中之一是:

它是一个类名声明

So
A类不是一个定义,因为它包含在一个限制中


为了澄清,引用C++11,
[basic.def]§2

第3.1.2段指出

声明是一个定义,除非它声明了一个没有 指定函数的主体(8.4),它包含外部说明符 (7.1.1)或联动装置规范25(7.5),且均不是初始值设定项 也不是函数体,它在类中声明静态数据成员 定义(9.2,9.4),它是一个类名声明(9.1),它是一个 不透明枚举声明(7.2),它是一个模板参数(14.1),它 是函数声明程序中的参数声明(8.3.5),该函数声明程序 不是函数定义的声明符,或者它是typedef 声明(7.1.3)、别名声明(7.1.3)、使用声明 (7.3.3)、静态声明(第7条)、属性- 声明(第7条)、空声明(第7条)或 使用指令(7.3.4)

这里

它是一个类名声明

在一份声明中

声明是一个定义,除非%restrictions%

百分比限制为%。这一部分很重要


我认为每个声明都是定义

让我们用一个例子来证明这不是真的。假设这是真的。然后,因为我们可以有许多重新声明,并且每个声明都是定义-我们可以有许多重新定义,对吗?但是C++标准N33 37 <强></强> 3.2/1表示

任何翻译单位不得包含一个以上的定义 变量、函数、类类型、枚举类型或模板


与我们的假设相矛盾的是,并非每个声明都是定义。

第3.1.2段指出

声明是一个定义,除非它声明了一个没有 指定函数的主体(8.4),它包含外部说明符 (7.1.1)或联动装置规范25(7.5),且均不是初始值设定项 也不是函数体,它在类中声明静态数据成员 定义(9.2,9.4),它是一个类名声明(9.1),它是一个 不透明枚举声明(7.2),它是一个模板参数(14.1),它 是函数声明程序中的参数声明(8.3.5),该函数声明程序 不是函数定义的声明符,或者它是typedef 声明(7.1.3)、别名声明(7.1.3)、使用声明 (7.3.3)、静态声明(第7条)、属性- 声明(第7条)、空声明(第7条)或 使用指令(7.3.4)

这里

它是一个类名声明

在一份声明中

声明是一个定义,除非%restrictions%

百分比限制为%。这一部分很重要


我认为每个声明都是定义

让我们用一个例子来证明这不是真的。假设这是真的。然后,因为我们可以有许多重新声明,并且每个声明都是定义-我们可以有许多重新定义,对吗?但是C++标准N33 37 <强></强> 3.2/1表示

任何翻译单位不得包含一个以上的定义 变量、函数、类类型、枚举类型或模板

什么与我们的假设相矛盾,因此并非每个声明都是定义。

考虑以下情况:

标题1.h:

class A;

void function1(A * a);
标题2.h:

class A;

void function2(A * a);
main.cpp

#include "Header1.h"
#include "Header2.h"

#include "A.h" // header file defining A

int main()
{

}
在编译器看来,这实际上是:

class A;

void function1(A * a);

class A;

void function2(A * a);


class A { /* definition from A.h */ };


int main()
{

}
考虑以下情况:

标题1.h:

class A;

void function1(A * a);
标题2.h:

class A;

void function2(A * a);
main.cpp

#include "Header1.h"
#include "Header2.h"

#include "A.h" // header file defining A

int main()
{

}
在编译器看来,这实际上是:

class A;

void function1(A * a);

class A;

void function2(A * a);


class A { /* definition from A.h */ };


int main()
{

}
您的引用(来自C++11 3.1/2)回答了一般性问题:“除非%restrictions%”意味着不是每个声明都是一个定义。如果这些限制都不适用,这只是一个定义

如果你阅读这些限制,你会发现

它是一个类名声明

这回答了你的具体问题<代码>A类
是类名声明,但不是定义

我找不到标准中允许在声明性区域中重新声明类类型的部分

通常,根据C++11 3.3.1/4,可以在同一声明区域多次声明一个实体

给定单个声明区域中的一组声明,其中每个声明指定相同的非限定名称,它们都应引用同一实体,或[此处不相关的其他情况]

您的引用(来自C++11 3.1/2)回答了一般性问题:“除非%restrictions%”意味着不是每个声明都是一个定义。如果这些限制都不适用,这只是一个定义

如果你阅读这些限制,你会发现

它是一个类名声明

这回答了你的具体问题<代码>A类
是类名声明,但不是定义

我找不到标准的一部分