如何解决英特尔 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 项(与评论中的链接相同)不鼓励这样做,但没有问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。