' is_trivially_destructible '不适用于继承的类

`is_trivially_destructible` does not work with inherited class

本文关键字:继承 适用于 trivially is destructible 不适用      更新时间:2023-10-16
#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,上面的代码会产生静态断言的编译错误。
但是,如果我继承MyclassNoConstructOperation is_trivially_destructible检查不工作,即使Myclass构造器是公共的。这段代码编译后,的原因是什么?

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

从cplusplus.com

:

一个普通可析类是一个类(用类、结构或联合定义),它:

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

  • 析构函数不是虚函数。

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

出自标准草案N4567 $12.4:

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

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

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

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