C++ 标准 : end of lifetime

标签 c++ language-lawyer lifetime

basic.life C++ 标准的一部分,可以找到以下内容(强调我的):

The lifetime of an object o of type T ends when:

  • if T is a class type with a non-trivial destructor ([class.dtor]), the destructor call starts, or

  • the storage which the object occupies is released, or is reused by an object that is not nested within o ([intro.object]).

我正在尝试查找对象 o 的存储示例,该对象被 嵌套在 o 中的对象重用(相反标准所说的)。

首先,我需要确保我理解标准中“对象占用的存储 [...] 被嵌套在 o 中的对象重用”的含义。首先,为了重用存储,必须创建一个新对象。其次,要重用 o 的存储,必须在 o 使用的内存位置创建新对象。最后,必须在使新对象“嵌套在 o 内”的内存位置创建新对象,例如在“嵌套在 o 内”的已存在对象的位置。这是正确的吗?

我想到了一些例子,比如:

  • union 成员:

    union U { double d; int n; }; U u = {1.0}; new (&u.n) int;
    
  • 在字符数组中创建的对象:

    char mem[sizeof(int)];
    new (mem) int;
    

这些正确吗?还有其他例子吗?

谢谢。

最佳答案

我相信,标准中的“此处嵌套对象”只是指此处的成员子对象。从形式上讲,成员子对象占用其容器对象的存储空间,没有这种异常,类似于此代码

struct X {
    Y y;
};

void foo(X& x) {
    new (x.y) Y;
}

将结束 x 的存储。

另一个符合标准 (http://eel.is/c++draft/intro.object#4) 的嵌套对象示例是一个对象为另一个对象提供存储的情况。 unsigned char(或 std::byte)数组可以为另一个对象提供存储,如果它是在其中创建并放置新的。这几乎是您的第二个示例,除了在您的情况下 char 可以是有符号的或无符号的。

您的 union 示例是占用相同存储空间的非嵌套对象的正确示例。

关于C++ 标准 : end of lifetime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48713700/

相关文章:

c++ - 结构化绑定(bind) : when something looks like a reference and behaves similarly to a reference, 但它不是引用

rust - 当我重新分配链表的一半时,不再引用的 block 会发生什么?

c++ - `decltype` 作为模板函数声明中模板类型规范的一部分

c++ - 在 C++ 中制作一个只有可变属性的类是不好的做法吗?

c++ - 线程和字符串文字

c++ - 在 C++ 中从多个矩阵创建一个矩阵

c++ - 限定符丢失转换 C++

C18 标准中的矛盾(关于字符集)?

struct - 为什么生命周期强制转换适用于结构而不适用于特征?

C++ - 使用 const 引用来延长临时成员,好的还是 UB?