2016-09-16 49 views
4
#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; 
} 

工作,如果我不NoConstructOperation上面的代码继承Myclass给人以静态断言编译错误。
但如果我继承MyclassNoConstructOperationis_trivially_destructible检查不起作用,即使Myclass构造函数是公共的。此代码编译,是什么原因?`is_trivially_destructible`不继承类

+3

你想用这个做什么? – Hayt

回答

9

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

cplusplus.com

甲平凡破坏类是一类(有类,结构或联合定义):

  • 采用隐含定义析构函数。

  • 析构函数不是虚拟的。

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

从标准草案N4567 $ 12.4:

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

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

(5.5) - 其类的所有直接基类具有微不足道的析构函数,并且

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

+0

虽然使得非虚拟的基类析构函数可能会产生不同的副作用。 – Hayt

+0

这不是唯一的问题 –

+0

我想强制执行我的客户端类Myka应该复制/移动构造函数/赋值为已删除,并且构造函数和析构函数位于“private”范围内。 任何更好的方法。 –