相关疑难解决方法(0)

reinterpret_cast创建一个简单的默认构造对象

cppreference 声明:

具有普通默认构造函数的对象可以通过reinterpret_cast在任何适当对齐的存储上使用来创建,例如在分配有的存储器上std::malloc.

这意味着以下是明确定义的代码:

struct X { int x; };
alignas(X) char buffer[sizeof(X)];    // (A)
reinterpret_cast<X*>(buffer)->x = 42; // (B)
Run Code Online (Sandbox Code Playgroud)

以下是三个问题:

  1. 这个引用是否正确?
  2. 如果是,那么X开始的生命周期是什么时候?如果在线(B),它是否被视为获取存储?如果在线(A),如果有一个分支(A)(B)有条件地构建一个X或其他一些pod,Y怎么办?
  3. 在这方面,C++ 11和C++ 1z之间有什么变化吗?

请注意,这是一个旧链接.针对这个问题,措辞发生了变化.它现在写道:

但是,与C不同,通过简单地重新解释适当对齐的存储来创建具有普通默认构造函数的对象,例如分配的内存std::malloc:placement-new是正式引入新对象并避免潜在的未定义行为所必需的.

c++ language-lawyer c++11 c++17

51
推荐指数
2
解决办法
1812
查看次数

具有空初始化的对象的生命周期

目前的标准草案在[basic.life/1]中说(以前的标准有相似的措辞):

对象或引用的生命周期是对象或引用的运行时属性.如果一个对象属于类或聚合类型,并且它或其子对象之一由除了普通默认构造函数之外的构造函数初始化,则称该对象具有非空的初始化.[注意:通过简单的复制/移动构造函数进行初始化是非空的初始化. - 结束注释]类型T对象的生命周期从以下开始:

(1.1)获得具有适当对齐和T型尺寸的存储,并且

(1.2)如果对象具有非空的初始化,则其初始化完成,

看到这段代码:

alignas(int) char obj[sizeof(int)];
Run Code Online (Sandbox Code Playgroud)

basic.life/1是否意味着这里int(和其他几种类型,具有相同或更小的对齐/尺寸要求int)已经开始了它的生命周期?

这甚至意味着什么?如果一个对象已经开始它的生命周期,它是否被创建?[intro.object/1]说:

[...]通过定义([basic.def]),通过new-expression,隐式更改union的活动成员([class.union])或创建临时对象时创建对象([conv.rval],[class.temporary])[...]

因此,根据这一点,我obj(作为int)不是创建的.但它作为一个int(以及其他可能是无限类型的空间可初始化对象)的生命已经开始.

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

c++ object-lifetime language-lawyer c++17

2
推荐指数
2
解决办法
238
查看次数

标签 统计

c++ ×2

c++17 ×2

language-lawyer ×2

c++11 ×1

object-lifetime ×1