首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >空析构函数与文字析构函数

空析构函数与文字析构函数
EN

Stack Overflow用户
提问于 2013-01-10 18:19:09
回答 1查看 2.6K关注 0票数 16

考虑以下代码:

代码语言:javascript
复制
#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是非文字的。

为什么一个空的析构函数和没有析构函数有什么区别?

编辑:另一个相关问题:如果空的析构函数和文本析构函数不同,如何定义受保护的文本析构函数?

EN

回答 1

Stack Overflow用户

发布于 2013-09-07 06:28:42

没有析构函数会导致编译器添加一个微不足道的析构函数,这在规范中有错误的定义,但基本上什么也不做。

如果指定析构函数,它不会添加简单的析构函数。你的析构函数不是微不足道的。

在您的例子中,Test::~Test() { }看起来非常微不足道,但这是对您所看到的内容的人类解释。为了更进一步,我们来看看:

代码语言:javascript
复制
Test::~Test()
{
    int a = 5;
}

我们可以看到优化器可以优化出a,所以它显然什么也没做。这样如何:

代码语言:javascript
复制
Test::~Test()
{
    for (int i = 0; i < 1000; i += 2) {
        if ((i % 2) == 1)
            doSomeSideEffect(); // like throwing or setting a global
    }
}

我们可以看到i永远不可能是奇怪的,所以析构函数什么也不做。

规范必须定义哪些内容可以成为常量表达式,哪些内容不能。他们并没有定义“什么都不做”,而是简单地声明,对于constexpr来说,唯一足够好的不做任何事情的析构函数就是编译器提供的微不足道的析构函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14255541

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档