【发布时间】:2013-01-10 10:19:09
【问题描述】:
考虑以下代码:
#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 是非文字的。
为什么空析构函数和没有析构函数有什么区别?
编辑:另一个相关问题:如果空和文字析构函数不同,如何定义受保护的文字析构函数?
【问题讨论】:
-
在 constexpr 对象中不能有非平凡的析构函数。
-
受保护的析构函数 = 几乎不是一个好主意。
-
你可以做
~Test() = default;,我想。 -
@Vincent 在这种情况下,为什么不使用 构造函数
protected而不是析构函数? -
@KonradRudolph 如果某个类打算成为其他类的基类,则其析构函数应该是虚拟的或受保护的,以防止通过基指针删除派生对象时出现 UB。
标签: c++ c++11 destructor constexpr user-defined-literals