【发布时间】:2021-07-28 14:22:12
【问题描述】:
我试图编译我的一些代码,这些代码在 g++(带有 --Wnon-virtual-dtor 标志)中编译得很好。另外,我的 IDE 和 clang-tidy 并没有警告我(我当然知道这可能是错误的)。
当我尝试使用英特尔的 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 的任何有用信息。
提前致谢, 弗卢斯劳夫
【问题讨论】:
-
你标记了这个 [c++14]?该警告似乎是指某些编码标准列表中的“第 14 项”,即通常是一个很好的设计理念,而 AFAICT 与 ISO C++14 无关,所以你对 C++ 版本有其他原因吗标记?
-
ups 是的-我的错我认为关键字已磨损.. override 可用作从 c++11 开始的关键字,我想表达这一点。我认为警告实际上以一种或另一种方式与cpp core guidelines 相关,但我认为这里不太正确。默认情况下,覆盖的函数将是虚拟的 - 我认为与其为某些虚拟函数编写默认的 int foo() 覆盖,不如编写 int foo() 覆盖 - 与析构函数等相同 - 是的,如果没有模板
-
我的意思是指导方针中的this item:一个函数应该准确地指定覆盖、最终和虚拟之一。 Effective C++ Item 实际上是指我认为 Scott Meyers 的书“有效的现代 c++”,但我拥有的版本没有说 item
标签: c++ compiler-warnings icc virtual-destructor