2

该类std::enable_shared_from_this是一个(模板)mixin,推荐用于从给定对象(或其地址)创建共享指针,它们都具有对象的共同所有权。

问题是,如果你有一个 T 类:

  1. 有虚方法
  2. 继承自std::enable_shared_from_this<T>(并且继承必须是公开的,如上面的链接中所述;否则 mixin 是无用的)
  3. 使用 GCC 编译-Wnon-virtual-dtor(也许还有 clang,我不确定)

您会收到有关std::enable_shared_from_this.

我的问题是 - 这里的错误在哪里?那是...

  • 应该std::enable_shared_from_this有一个虚拟析构函数吗?(我不这么认为)
  • 非虚拟析构函数警告是否应该使用一些标准来确定它何时发出(如果完全启用,那就是)?
  • 应该保护析构函数std::enable_shared_from_this吗?(这甚至会起作用吗?)
  • 带有这个 mixin 的类应该根本没有虚拟方法吗?

我很困惑。

4

1 回答 1

1

没有过错;你的代码很好。这只是一个假阳性。警告的重点是检测代码片段,这些代码虽然是有效的 C++,但通常表明存在问题。但是“通常”并不意味着“总是”,所以大多数警告都有误报的情况,它认为有误用,而实际上没有。

应该std::enable_shared_from_this有一个虚拟析构函数吗?

预计没有代码会删除指向enable_shared_from_this. 所以不行。

非虚拟析构函数警告是否应该使用一些标准来确定它何时发出(如果完全启用,那就是)?

编译器知道你打算做什么是不合理的。它只是看到一些通常是问题的东西,你决定让它标记。在这种情况下,这不是问题。

应该保护析构函数std::enable_shared_from_this吗?

不。

带有这个 mixin 的类应该根本没有虚拟方法吗?

不。

于 2020-07-21T22:35:51.263 回答