C++ 为什么不是定义的对象的声明的类型说明符不能是抽象类类型 结构A{ 虚拟void fun()=0; }; 外部A//#1. void foo(A)//#2. int main(){}
在#1和#2的声明都被GCC和Clang投诉为无效声明。结果是 然而,根据目前的草案,它并没有明确禁止这种用法。它的状态如下所示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]),既不包含初始值设定项也不包含函数体 它是不是函数定义的声明器的函数声明器中
在对象的定义中,该对象的类型不得是不完整类型([basic.types])、抽象类类型或其(可能是多维)数组 在我的示例中,根据
,位于#1的对象
a
和位于#2的未命名参数仅仅是声明而不是定义
声明中声明的每个实体也由该声明定义,除非:
- 它包含外部说明符或链接规范19([dcl.link]),既不包含初始值设定项也不包含函数体
- 它是不是函数定义的声明器的函数声明器中的参数声明
那么,根据编译器的行为,它是否可以说,在对象的声明中,该对象的类型不应该是抽象类类型?如果我遗漏了一些限制抽象类类型使用的规范性规则,请指出。鉴于这两种声明都无法实现,编译器不允许它们并非不合理。标准规定,任何编译器都必须允许定义类型不完整的对象,但它没有具体说明是否应该允许声明。由于给出了这样一个声明,它将无法链接我们是否定义它,因此编译器将明智地采取行动并提醒您此问题是有意义的。@AlanBirtles如果我们不使用该实体,则无需实现。GCC11中支持P0929R2,请参阅。对于clang,我只发现GCC11接受它。