Рассмотрим следующий код:
#include <iostream>
class Test
{
public:
constexpr Test(const int x) : _x(x) {}
constexpr int get() const {return _x;}
~Test() {} // HERE
protected:
const int _x;
};
int main()
{
static constexpr Test test(5);
return 0;
}
Если я удаляю строку HERE
, код хорошо компилируется, но если я определяю пустой деструктор, это приводит к ошибке компиляции, говорящей, что Test
не является литералом.
Почему и в чем разница между пустым деструктором и вообще отсутствием деструктора?
EDIT: Другой связанный вопрос: если пустые и литературные деструкторы различны, как определить защищенный деструктор литерала?