考虑以下代码:
#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是非文字的。
为什么一个空的析构函数和没有析构函数有什么区别?
编辑:另一个相关问题:如果空的析构函数和文本析构函数不同,如何定义受保护的文本析构函数?
发布于 2013-09-07 06:28:42
没有析构函数会导致编译器添加一个微不足道的析构函数,这在规范中有错误的定义,但基本上什么也不做。
如果指定析构函数,它不会添加简单的析构函数。你的析构函数不是微不足道的。
在您的例子中,Test::~Test() { }看起来非常微不足道,但这是对您所看到的内容的人类解释。为了更进一步,我们来看看:
Test::~Test()
{
int a = 5;
}我们可以看到优化器可以优化出a,所以它显然什么也没做。这样如何:
Test::~Test()
{
for (int i = 0; i < 1000; i += 2) {
if ((i % 2) == 1)
doSomeSideEffect(); // like throwing or setting a global
}
}我们可以看到i永远不可能是奇怪的,所以析构函数什么也不做。
规范必须定义哪些内容可以成为常量表达式,哪些内容不能。他们并没有定义“什么都不做”,而是简单地声明,对于constexpr来说,唯一足够好的不做任何事情的析构函数就是编译器提供的微不足道的析构函数。
https://stackoverflow.com/questions/14255541
复制相似问题