英特尔 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 相同)不鼓励这样做,但没有问题。
我试图编译我的一些代码,在 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 相同)不鼓励这样做,但没有问题。