为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++
萧十郎 2019-09-02 20:15:49
具有普通默认构造函数的对象可以通过reinterpret_cast在任何适当对齐的存储上使用来创建,例如在分配有的存储器上std::malloc。这意味着以下是明确定义的代码:struct X { int x; };alignas(X) char buffer[sizeof(X)];    // (A)reinterpret_cast<X*>(buffer)->x = 42; // (B)以下是三个问题:这个引用是否正确?如果是,那么X开始的生命周期是什么时候?如果在线(B),它是否被视为获取存储?如果在线(A),如果有一个分支(A)和(B)有条件地构建一个X或其他一些pod,Y怎么办?在这方面,C ++ 11和C ++ 1z之间有什么变化吗?†请注意,这是一个旧链接。针对这个问题,措辞发生了变化。它现在写道:但是,与C不同,通过简单地重新解释适当对齐的存储来创建具有普通默认构造函数的对象,例如分配的内存std::malloc:placement-new是正式引入新对象并避免潜在的未定义行为所必需的。
查看完整描述

3 回答

?
月关宝盒

TA贡献1772条经验 获得超5个赞

此分析基于n4567,并使用其中的节号。


§5.2.10/ 7:当v对象指针类型的prvalue 转换为对象指针类型“指向cv T的指针”时,结果为static_cast<cv T*>(static_cast<cv void*>(v))。


所以,在这种情况下,它reinterpret_cast<X*>(buffer)是相同的static_cast<X *>(static_cast<void *>(buffer))。这使我们看到有关的相关部分static_cast:


§5.2.9/ 13:类型为“指向cv1 void的指针”的prvalue可以转换为类型为“指向cv2 T的指针”的prvalue ,其中T是对象类型,cv2与cv-qualification相同或更高cv-qualification比cv1。空指针值将转换为目标类型的空指针值。如果原始指针值表示A存储器中字节的地址并A满足对齐要求T,则结果指针值表示与原始指针值相同的地址,即A。


我相信这足以说原始报价是正确的 - 这种转换给出了明确的结果。


至于寿命,这取决于你所说的一生。强制转换创建了一个指针类型的新对象 - 一个临时对象,它具有从演员阵容所在的行开始的生命周期,并在它超出范围时结束。如果有两个不同的转换有条件地发生,则每个指针的生命周期都从创建它的转换的位置开始。


这些都不会影响提供底层存储的对象的buffer生命周期,无论是否为该存储创建指针(具有相同或转换类型),它仍具有完全相同的生命周期。


查看完整回答
反对 回复 2019-09-02
  • 3 回答
  • 0 关注
  • 469 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信