【问题标题】:What does the C++ standard mean regarding object lifetime begins?关于对象生命周期开始的 C++ 标准是什么意思?
【发布时间】:2013-12-05 20:02:11
【问题描述】:

在第 3.8.1 节的 n3690 C++ 标准中有这样的文字:

The lifetime of an object of type T begins when:
— storage with the proper alignment and size for type T is obtained, and
— if the object has non-trivial initialization, its initialization is complete.

假设有一个用户定义的构造函数。

最后一句是什么意思?是在初始化列表完成初始化还是在构造函数主体完成运行时?还是最后一句话有别的意思?

【问题讨论】:

  • 构造函数体运行完毕。
  • 好的,但是你怎么知道的?我的意思是我怎么能读到构造函数体已经从“,它的初始化完成了”运行?
  • 在构造函数调用之后的下一条语句完成。
  • 我确定你是对的,但我很好奇,你是怎么知道的?
  • 你是在问标准在哪里说运行构造函数算作初始化?

标签: c++ standards language-lawyer


【解决方案1】:

12.6.2,[class.base.init],第6项,列出初始化的步骤,这是最后一个:

最后,构造函数体的复合语句被执行。

所以一旦主体执行完毕,初始化就完成了。

【讨论】:

  • 整个部分(在 n3690 中是第 10 项)阐明了这一点。谢谢。
【解决方案2】:

有个说明:

"[ 注意:通过简单的复制/移动构造函数进行初始化是 非平凡的初始化。 ——尾注]"

这意味着普通构造函数何时完成执行。

【讨论】:

  • 你的意思是这意味着对象生命周期在复制/移动 ctor 完成时开始?或者 &rhs 对象的生命周期是在复制/移动 ctor 内部开始的吗?
【解决方案3】:

当构造函数完成运行时

这个。在构造过程中抛出的对象不能保证建立其不变量,因此它的生命周期不会开始。这样做的结果是不会调用析构函数:

#include <iostream>

struct Stillborn
{
    Stillborn()
    {
        std::cout << "inside constructor\n";
        throw 42;
    }

    ~Stillborn()
    {
        std::cout << "inside destructor\n";
    }
};

int main()
{
    try
    {
        Stillborn x;
    }
    catch (...)
    {
        std::cout << "inside catch block\n";
    }
}

live demo。请注意“内部析构函数”如何没有出现在输出中。

【讨论】:

  • 你怎么知道的?
  • 我猜这只是常见的 C++ 知识。我可以建议你把Exceptional C++放在圣诞树下吗? ;)
猜你喜欢
  • 2013-06-11
  • 2023-03-29
  • 1970-01-01
  • 2012-07-08
  • 2014-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多