C++ std::从这个、非虚拟析构函数和公共继承中启用共享

C++ std::从这个、非虚拟析构函数和公共继承中启用共享,c++,compiler-warnings,libstdc++,virtual-destructor,enable-shared-from-this,C++,Compiler Warnings,Libstdc++,Virtual Destructor,Enable Shared From This,该类是一个(模板)mixin,建议用于从给定对象(或其地址)创建共享指针,这些对象都具有对象的公共所有权 问题是,如果你有一个T类: 有虚拟的方法 继承自std::enable_shared_from_this(继承必须是公共的,如上面的链接所述;否则mixin是无用的) 使用GCC编译-Wnon virtual dtor(我不确定是否也使用clang) 您将从\u this获得关于std::enable\u shared\u的非虚拟析构函数的警告 我的问题是-这里的故障在哪里?那就是 std

该类是一个(模板)mixin,建议用于从给定对象(或其地址)创建共享指针,这些对象都具有对象的公共所有权

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

  • 有虚拟的方法
  • 继承自
    std::enable_shared_from_this
    (继承必须是公共的,如上面的链接所述;否则mixin是无用的)
  • 使用GCC编译
    -Wnon virtual dtor
    (我不确定是否也使用clang)
  • 您将从\u this获得关于
    std::enable\u shared\u的非虚拟析构函数的警告

    我的问题是-这里的故障在哪里?那就是

    • std::是否应该从该
      启用虚拟析构函数?(我不这么认为)
    • 非虚拟析构函数警告是否应该在何时发出时采用某种标准(即,如果启用)
    • std::enable\u shared\u的析构函数是否应该被保护?(这会起作用吗?)
    • 具有此mixin的类是否应该根本没有虚拟方法

    我很困惑。

    没有错;你的代码很好。这只是一个假阳性。警告的要点是检测代码,尽管有效C++通常指示问题。但“通常”并不意味着“总是”,因此大多数警告都有误报的情况,即它认为有误用,而实际上没有误用

    std::是否应该从该
    启用虚拟析构函数

    不需要任何代码从\u this
    中删除指向
    启用\u共享\u的指针。所以没有

    非虚拟析构函数警告是否应该在何时发出时采用某种标准(即,如果启用)

    编译器完全了解您打算做的事情是不合理的。它只是看到一些通常是问题的东西,你已经决定把它标记出来。在这种情况下,这不是问题

    std::enable\u shared\u的析构函数是否应该被保护

    没有

    具有此mixin的类是否应该根本没有虚拟方法


    这是肯定的,但讨论没有考虑我提到的两个可能的选择。我特别感兴趣的是这里没有提到的“受保护的dtor”替代方案。如果不希望任何代码从这个
    中删除一个
    启用\u共享\u,那么为什么该类应该有一个公共析构函数?另外,编辑以反映我对这个问题的澄清编辑。