C++ 强制clang在此C+;代码段上生成编译错误+;代码

C++ 强制clang在此C+;代码段上生成编译错误+;代码,c++,gcc,clang,C++,Gcc,Clang,我有以下无效代码: X类{ 公众: 虚void func()=0; }; 刚宣布的班级{ X缺失(); }; int main(){return 0;} 它不在gcc下编译,因为不可能创建抽象类X的实例,而这正是作为JustDeclared::missing()方法的返回值声明的 但是,clang++和Visual Studio编译此代码段时没有出现问题。我怀疑这是因为在实际编译之前简单地剥离了AST中未使用的部分 但是,是否有可能启用一些“迂腐”模式,强制clang为此代码段生成错误?直到C

我有以下无效代码:

X类{
公众:
虚void func()=0;
};
刚宣布的班级{
X缺失();
};
int main(){return 0;}
它不在gcc下编译,因为不可能创建抽象类
X
的实例,而这正是作为
JustDeclared::missing()
方法的返回值声明的

但是,clang++和Visual Studio编译此代码段时没有出现问题。我怀疑这是因为在实际编译之前简单地剥离了AST中未使用的部分


但是,是否有可能启用一些“迂腐”模式,强制clang为此代码段生成错误?

直到C++14,在C++17的原始版本中,对于clang,这在clang和MSVC中都被认为是一个bug(见下文)由于抽象类类型诊断是在函数定义时执行的,而不是在(第一次)函数声明时执行的(与ISO标准规则相反),因此很可能是MSVC。但是,正如中所述,从C++20开始,Clang和MSVC接受该程序实际上是正确的,而GCC拒绝该程序则是错误的。如中所述,P0929R2应视为C++17中的缺陷报告


以下所有标准参考文献均指

C++17之前的标准行为 根据[重点我的]

抽象类不得用作参数类型、函数返回类型或显式转换类型。 可以声明抽象类的指针和引用。 [ 例如:

shape x;           // error: object of abstract class
shape* p;          // OK
shape f();         // error
void g(shape);     // error
shape& h(shape&);  // OK
 — 结束示例 ]

抽象类不能用作函数返回类型,因此即使未使用
JustDeclared
,程序的格式也是错误的

对于Clang,这是bug报告

自2016年以来一直处于休眠状态。2014年提交了修复该漏洞的尝试:

识别出与上述标准相同的不符合项[强调矿山]:

附加补丁包含PR18393[1]的修复程序实现。根据标准“抽象类不得用作参数类型、函数返回类型或显式转换类型”(class.abstract$10.4.3)

当前,检查类型是否不是抽象类是在方法 是定义的,但我看不出任何理由为什么叮当不应该这样做 在这种情况下,尽早声明函数/方法。 测试也附上

然而,这个补丁尚未完成,可以说似乎已经死在水里了


但是,是否有可能启用一些“迂腐”模式,强制clang为此代码段生成错误

如上所述,对于C++20和C++17(缺陷后移植),Clang实际上可以正确地接受该程序。因此,即使这在C++14(和非缺陷移植的C++17)之前是一个错误,上述错误报告可能会被弃用,因为自P0929R2起,该标准已更改为以前Clang的错误行为


请注意,如果您不仅声明而且还定义了
JustDeclared::missing()
,那么Clang将通过违反[class.abstract]/3正确地将程序诊断为格式错误,而[class.abstract]/3也适用于C++20(/在应用P0929R2之后)。

Clang不会编译
JustDeclared::missing
:我怀疑他们是否会“修复”“它,看!”过路人很有趣,我还没见过,发现得不错。