新标准中的memcpy终身初始化规则有哪些变化?

时间:2017-10-20 00:43:49

标签: c++ language-lawyer c++17 memcpy object-lifetime

据我所知,memcpy安全地用于未初始化的存储cannot来创建源对象的副本。

然而,在去年的this thread开放式标准WG21" ub"列表,参与者引用新的memcpy生命周期启动规则

  

这似乎没有达到错误报告的水平,但它可能会   与新的memcpy生命周期启动规则相关。他们会吗   将一些静态类型归因于源和目标字节?

根据问题的上下文和少量的类型擦除示例代码,它似乎与通过aligned_storagememcpy中创建新对象有关。

尽可能搜索,我无法找到对新规则的引用。我特别好奇,如果他们只是申请替换已经创建的对象的内容,或者他们改变了未初始化内存中潜在创建对象的情况。

2 个答案:

答案 0 :(得分:4)

措辞有所改变,但总体思路仍然相同。来自intro.object

  

对象由定义, new-expression 创建,当隐式更改union的活动成员时,或者创建临时对象时[ conv.rval],[class.temporary])。

这些只是 四种在C ++中创建对象的方法。 memcpy不属于这四个条件中的任何一个,因此它现在(以前从未有过)创建生命周期(隐式更改联合的活动成员可以via = only完成,而不是通过{{ 1}})。

引用是指对标准的假设性未来变化,在某些情况下会memcpy具有这种能力。今年早些时候,该主题也有very long thread

答案 1 :(得分:1)

在C ++ 20中,措辞已经发生了一些变化。所做的更改基于p0593r6,自C ++ 98(含C ++)起追溯适用于所有版本,因此尽管措辞恰好出现在C ++ 20规范中,但C ++ 17仍然适用至于C ++ 98等。

来自intro.object

  1. C ++程序中的构造创建,销毁,引用,访问和操作对象。对象是通过定义,新表达式,通过隐式创建对象的操作创建的(请参见下文) ...

...

  1. 此外,在的指定区域内隐式创建对象之后 存储,一些操作被描述为生成指向 合适的创建对象。这些操作选择以下一项 隐式创建的对象,其地址为起始地址 的存储区域,并产生一个指向的指针值 该对象,如果该值将导致程序已定义 行为。如果没有这样的指针值将给程序定义 行为,程序的行为是不确定的。如果多个这样 指针值将赋予程序定义的行为,它是 未指明产生哪种指针值。

另请参阅this SO answer