代码之家  ›  专栏  ›  技术社区  ›  geza

初始化为空的对象的生存期

  •  2
  • geza  · 技术社区  · 6 年前

    现行标准草案中(以前的标准有类似的措辞) [basic.life/1]

    对象或引用的生存期是 对象或引用。物体被称为非真空的 默认构造函数。[注:通过简单的复制/移动进行初始化 构造函数是非空初始化。【结束语】生命周期 类型为T的对象的定义始于:

    获得T型的对准度和尺寸,以及

    非空初始化,初始化完成,

    alignas(int) char obj[sizeof(int)];
    

    int (以及其他几种类型,其对齐/尺寸要求与 内景 )已经开始了它的生命?

    [intro.object/1] 说:

    […]对象由定义创建([基本.def]),通过新表达式,隐式更改联合的活动成员时([类联合体]),或创建临时对象时([变压器], [类别:临时]) [...]

    所以,根据这个,我的 obj (作为 内景 (以及其他可能是无限类型的可真空初始化对象)已经开始。

    我很困惑,你能澄清一下吗?

    3 回复  |  直到 4 年前
        1
  •  8
  •   Nicol Bolas    6 年前

    除非对象已被删除,否则不能开始对象的生存期 . 以及[简介对象]/1定义了创建对象的唯一方法:

    此定义创建的对象的类型为 char[] . 因此,这是唯一一个生命周期开始的对象。并且这个构造不会创建其他对象。

    为了解释这一解释,C++ 20的建议 P0593 允许 正是这个声明隐式地创建了其他这样的对象。


    评论:

    它之所以存在,是因为它不能对没有进行初始化的对象说“初始化完成了”。

    假设,我有一个 new(obj) int int 对象。但在此之前, obj 已获得必要的存储。

    不,是关于 目标 字符[] . 什么可以为 内景 正在创建的对象是 new(obj)

    仅仅因为存储碰巧已经存在并不意味着它没有被获取。

        2
  •  5
  •   aschepler    6 年前

    T 开始于。。。

    意思

    假设一个程序创建一个 T型 ,下面描述该对象的生存期何时开始。。。

    而不是

    如果满足以下条件,则 T型

    也就是说,还有一个隐含的附加条件,即对象是以中描述的某种方式“创建”的[简介对象]/1. 但是这段话[基本生活]1/并不意味着本身就意味着任何物体存在,只意味着存在的物体的属性之一。

    char[sizeof(int)] 以及一个或多个 char int 隐含的存在,我们不会说任何关于这样一个对象的生命周期。

        3
  •  0
  •   supercat    6 年前

    因为标准故意避免要求所有实现都适用于所有目的,所以对于用于各种目的的高质量实现来说,通常有必要保证代码的行为,而标准本身不会对这些行为强加任何要求。

    如果某种类型 T 支持隐式对象创建,程序将某个对象的地址转换为 T* ,一个旨在支持低级编程概念而不需要特殊语法的高质量实现,其行为就像这种转换创建类型的对象一样 在允许程序定义行为,但不会隐式创建此类对象的情况下,这样做是不必要的,但会通过销毁其他对象而导致未定义的行为。

    float uint32_t 具有相同的尺寸和对齐要求,然后给出。

    alignas(uint32_t) char obj[sizeof(uint32_t)];
    
    float *fp = (float*)obj;
    *fp = 1.0f;
    uint32_t *up = (uint32_t*)obj;
    

    fp 会创造一个 浮动 因为要把任务交给 *fp 工作。如果 up 将以需要 第32页 向上的 可以在摧毁 浮动 就在那里。如果 向上的 不是这样用的,但是 使用方式要求 仍然存在,那 浮动

    注意,不特别适合于低级编程的实现可能不支持这里描述的语义。该标准的作者允许编译器编写者支持或不支持这样的语义,这取决于它们是否对编译器的预期目的是必要的;不幸的是,目前还没有任何标准的方法来区分适合这样的目的的编译器和不适合这样的目的的编译器。