首页 > 后端开发 > C++ > 正文

C 中临时对象的销毁顺序是否得到保证?

Susan Sarandon
发布: 2024-11-12 07:49:01
原创
887 人浏览过

Is the Destruction Order of Temporary Objects Guaranteed in C  ?

C 中临时对象的销毁

考虑以下代码:

#include <iostream>

struct Foo
{
    const char* m_name;

    ~Foo() { std::cout << m_name << '\n'; }
};

int main()
{
    Foo foo{"three"};
    Foo{"one"};   // unnamed object
    std::cout << "two" << '\n';
}
登录后复制

很明显,输出将是“一”、“二”、“三”。这就提出了一个问题:所有 C 编译器都保证这种行为吗?

根据 C 标准,在 [class.temporary] 中,它指出:

“临时对象作为最后一个对象被销毁评估(词法上)包含它们创建点的完整表达式的步骤。”

此规则意味着临时对象(例如提供的代码中未命名的 Foo 对象)将在最后被销毁创建它们时的完整表达式,即行末尾的分号。

值得注意的是,这个一般规则有一些例外,在 [class.temporary] p5、p6 中概述和 p7:

  1. 缩短数组初始值设定项中默认构造的临时对象的生命周期。
  2. 缩短数组复制期间构造函数的默认参数的生命周期。
  3. 通过绑定对临时对象的引用来延长临时对象的生命周期。
  4. 在“for-range-initializer”中延长临时对象的生命周期。

但是,在提供的代码中,这些例外情况都不适用,确保临时对象在各自表达式末尾得到销毁。

以上是C 中临时对象的销毁顺序是否得到保证?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板