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

Intel C++ compiler and Wnon-virtual-dtor flag gives (wrong?) warning

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

当我尝试使用 Intel 的 icpc(实际上是这个 icpc (ICC) 19.1.2.254 20200623)编译相同的代码时,我收到了一个警告,现在我能够找到它 - 我想知道我是否有问题或者这个警告在我的情况下是否真的不正确。

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

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 项(与评论中的 link 相同)不鼓励这样做,但没有问题。