`is_trivially_destructible`不适用于继承的类

时间:2016-09-16 09:52:11

标签: c++ c++11 visual-c++ c++14

#include <iostream>
using namespace std;


    class NoConstructOperation
    {
    protected:
        NoConstructOperation() = default;
        virtual ~NoConstructOperation() = default;
    public:
        NoConstructOperation(const NoConstructOperation&) = delete;
        NoConstructOperation& operator =(NoConstructOperation&) = delete;
        NoConstructOperation(NoConstructOperation&&) = delete;
        NoConstructOperation& operator = (NoConstructOperation&&) = delete;
    };

class Myclass:public NoConstructOperation
{

};


int main() {
    static_assert(!std::is_trivially_destructible<Myclass>::value, "Compiler provided destructor is public: Please declare it private");
    return 0;
}  

如果我没有继承Myclass上面的NoConstructOperation代码,则会出现静态断言的编译错误。
  但是,如果我使用Myclass NoConstructOperation继承is_trivially_destructible,则检查不起作用,即使Myclass构造函数是公共的。这段代码编译,是什么原因

1 个答案:

答案 0 :(得分:9)

您将NoConstructorOperation的析构函数定义为virtual。删除virtual将按预期触发静态断言:wandbox example

来自cplusplus.com

  

一个简单的可破坏的类是一个类(用类,结构或联合定义):

     
      
  • 使用隐式定义的析构函数。

  •   
  • 析构函数不是虚拟的。

  •   
  • 它的基类和非静态数据成员(如果有的话)本身也是易于破坏的类型。

  •   

从标准草案N4567 $ 12.4:

  

如果析构函数不是用户提供的,并且如果:

,则析构函数很简单      

(5.4) - 析构函数不是虚拟的,

     

(5.5) - 其类的所有直接基类都有简单的析构函数,

     

(5.6) - 对于类的所有类型(或其数组)的非静态数据成员,每个都是这样的   class有一个简单的析构函数。