std::enable_shared_from_this
类是一个(模板(mixin,建议用于从给定对象(或其地址(创建共享指针,这些对象都具有对象的共同所有权。
问题是,如果你有一个T类,它是:
- 具有虚拟方法
- 从
std::enable_shared_from_this<T>
继承(继承必须是公共的,如上面的链接所述;否则mixin就没用了( - 使用
-Wnon-virtual-dtor
的GCC进行编译(也许也使用clang,我不确定(
您会收到关于std::enable_shared_from_this
的非虚拟析构函数的警告。
我的问题是——这里的错在哪里?那就是…
std::enable_shared_from_this
应该有一个虚拟析构函数吗?(我不这么认为(- 非虚拟析构函数警告是否应该在发出时采用某种标准(如果启用了,也就是说(
- 应该保护
std::enable_shared_from_this
的析构函数吗?(这行得通吗?( - 具有此mixin的类是否应该根本不具有虚拟方法
我很困惑。
没有故障;你的代码很好。这只是一个假阳性。警告的目的是检测一些代码,这些代码虽然是有效的C++,但通常表明存在问题。但是";通常";并不意味着";总是";,因此,大多数警告都有误报的情况,即它认为存在滥用,而实际上没有。
std::enable_shared_from_this
应该有一个虚拟析构函数吗?
不需要任何代码来删除指向enable_shared_from_this
的指针。所以没有。
非虚拟析构函数警告是否应该在发出时采用某种标准(如果启用了,也就是说(?
编译器知道你打算做什么的一切是不合理的。它只是看到了一些通常是问题的东西,你决定让它标记出来。在这种情况下,这不是问题。
是否应该保护
std::enable_shared_from_this
的析构函数?
否。
具有此mixin的类是否应该根本没有虚拟方法?
否。