Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.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++ 为什么不是定义的对象的声明的类型说明符不能是抽象类类型 结构A{ 虚拟void fun()=0; }; 外部A//#1. void foo(A)//#2. int main(){}_C++_Language Lawyer - Fatal编程技术网

C++ 为什么不是定义的对象的声明的类型说明符不能是抽象类类型 结构A{ 虚拟void fun()=0; }; 外部A//#1. void foo(A)//#2. int main(){}

C++ 为什么不是定义的对象的声明的类型说明符不能是抽象类类型 结构A{ 虚拟void fun()=0; }; 外部A//#1. void foo(A)//#2. int main(){},c++,language-lawyer,C++,Language Lawyer,在#1和#2的声明都被GCC和Clang投诉为无效声明。结果是 然而,根据目前的草案,它并没有明确禁止这种用法。它的状态如下所示 在对象的定义中,该对象的类型不得是不完整类型([basic.types])、抽象类类型或其(可能是多维)数组 在我的示例中,根据,位于#1的对象a和位于#2的未命名参数仅仅是声明而不是定义 声明中声明的每个实体也由该声明定义,除非: 它包含外部说明符或链接规范19([dcl.link]),既不包含初始值设定项也不包含函数体 它是不是函数定义的声明器的函数声明器中

在#1和#2的声明都被GCC和Clang投诉为无效声明。结果是

然而,根据目前的草案,它并没有明确禁止这种用法。它的状态如下所示

在对象的定义中,该对象的类型不得是不完整类型([basic.types])、抽象类类型或其(可能是多维)数组

在我的示例中,根据
,位于#1的对象
a
和位于#2的未命名参数仅仅是声明而不是定义

声明中声明的每个实体也由该声明定义,除非:

  • 它包含外部说明符或链接规范19([dcl.link]),既不包含初始值设定项也不包含函数体
  • 它是不是函数定义的声明器的函数声明器中的参数声明
另一个限制与本例相关的抽象类类型使用的地方是第节

函数定义的参数类型或返回类型不应是函数体中不完整或抽象的(可能是cv限定的)类类型,除非函数被删除

换句话说,它不限制在非定义的函数声明中使用抽象类类型


那么,根据编译器的行为,它是否可以说,在对象的声明中,该对象的类型不应该是抽象类类型?如果我遗漏了一些限制抽象类类型使用的规范性规则,请指出。

鉴于这两种声明都无法实现,编译器不允许它们并非不合理。标准规定,任何编译器都必须允许定义类型不完整的对象,但它没有具体说明是否应该允许声明。由于给出了这样一个声明,它将无法链接我们是否定义它,因此编译器将明智地采取行动并提醒您此问题是有意义的。@AlanBirtles如果我们不使用该实体,则无需实现。GCC11中支持P0929R2,请参阅。对于clang,我只发现GCC11接受它。