#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
构造函数是公共的。这段代码编译,是什么原因?
答案 0 :(得分:9)
您将NoConstructorOperation
的析构函数定义为virtual
。删除virtual
将按预期触发静态断言:wandbox example。
一个简单的可破坏的类是一个类(用类,结构或联合定义):
使用隐式定义的析构函数。
析构函数不是虚拟的。
它的基类和非静态数据成员(如果有的话)本身也是易于破坏的类型。
从标准草案N4567 $ 12.4:
如果析构函数不是用户提供的,并且如果:
,则析构函数很简单(5.4) - 析构函数不是虚拟的,
(5.5) - 其类的所有直接基类都有简单的析构函数,
(5.6) - 对于类的所有类型(或其数组)的非静态数据成员,每个都是这样的 class有一个简单的析构函数。