英特尔 C++ 编译器和 Wnon-virtual-dtor 标志给出错误?警告

问题描述

我试图编译我的一些代码,在 g++(带有 --Wnon-virtual-dtor 标志)中编译得很好。另外,我的 IDE 和 clang-tidy 没有警告我(我当然知道这可能是错误的)。

当我尝试使用 Intel 的 icpc(实际上是这个 icpc (ICC) 19.1.2.254 20200623)编译相同的代码时,我收到了一个警告,我现在可以追踪到该警告 - 我想知道我是否有某种错误或是否就我而言,该警告实际上是不正确的。

我写了一个类层次结构的最小示例:

template<typename T>
class B {
        public:
                B() = default;
                virtual ~B() = default;
};

template<typename T>
class C : public B<T> {
        public:
                C() = default;
                ~C() override = default;

                virtual int foo() { return 0; };
};

template<typename T>
class D : public C<T> {
        public:
                D() = default;
                ~D() override = default;
                int foo() override { return 1; };
};


int main() {
        return 0;
}

使用 icpc -Wnon-virtual-dtor foo.cpp 编译时,我收到以下警告:

foo.cpp(15): warning #2026: Effective C++ Item 14 Make sure base classes C have virtual destructors
  };
   ^

可以通过明确声明 C 中的析构函数是虚拟的(所以 virtual ~C() override = default;)来摆脱这一点。

注意,去掉模板也可以让代码在没有任何警告的情况下编译。

最后 - 去掉 foo 成员函数将使代码在没有警告的情况下编译。

是的 - 我的问题是:这是 icpc 中的“错误”还是我做错了什么?

我真的找不到关于警告 #2026 的任何有用信息。

提前致谢, 弗劳斯劳夫

解决方法

好的,所以在发布此 question on the Intel forum 之后 - 似乎是编译器中的(一个非常非关键的)错误 - 解决方法是同时编写 virtual override

cpp 核心指南中的第 C.128 项(与评论中的链接相同)不鼓励这样做,但没有问题。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...