2016-09-16 3 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; 
} 

Если я не наследуют Myclass с NoConstructOperation выше код дает ошибку компиляции с статической проверки.
Но если я наследую Myclass с NoConstructOperationis_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

Я хочу, чтобы мой класс клиента был aka Myclass должен иметь конструкторы/назначения copy/move как удаленные, а конструктор и деструктор '' '' находятся в 'private'. Любой лучший подход для этого. –

Смежные вопросы