我有一个宠物项目,我用它来试验 C++11 的新功能。虽然我有使用 C 的经验,但我对 C++ 还很陌生。为了训练自己采用最佳实践(除了大量阅读之外),我启用了一些严格的编译器参数(使用 GCC 4.4.1):
-std=c++0x -Werror -Wall -Winline -Weffc++ -pedantic-errors
这对我来说效果很好。到目前为止,我已经能够解决所有障碍。但是,我需要enable_shared_from_this
,这给我带来了问题。编译代码时(可能由以下原因触发),我收到以下警告(在我的情况下是错误)-Weffc++
):
base class ‘class std::enable_shared_from_this<Package>’ has a non-virtual destructor
所以基本上,我对这个实现有点困扰enable_shared_from_this
, 因为:
- 类的析构函数是intended用于子类化应该总是是虚拟的,恕我直言。
- 析构函数是空的,为什么要有它呢?
- 我无法想象有人会想通过引用删除他们的实例
enable_shared_from_this
.
但我正在寻找解决这个问题的方法,所以我的问题是,是否有正确的方法来处理这个问题?并且:我认为这个析构函数是伪造的,或者它有真正的目的吗?
恕我直言,用于子类化的类的析构函数应该始终是虚拟的。
仅当要通过指向基类的指针删除派生类的实例时,才需要基类中的虚拟析构函数。
在类中拥有任何虚函数(包括析构函数)都需要开销。 Boost(以及 TR1 和 C++11 标准库)不想仅仅因为您需要能够获得shared_ptr
来自this
指针。
析构函数是空的,为什么要有它呢?
如果您没有用户定义的构造函数,编译器会为您提供一个,所以这并不重要。
我无法想象有人会想通过引用删除他们的实例enable_shared_from_this
.
Exactly.
至于编译器警告,我会忽略警告或抑制它(在代码中添加注释解释为什么要这样做)。有时,特别是在“迂腐”的警告级别,编译器警告是没有帮助的,我想说这就是其中一种情况。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)