英特尔 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 的任何有用信息。

提前致谢, 弗劳斯劳夫

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)