2017-10-20 43 views
2

据我所知,memcpy成为未初始化存储cannot安全地用于创建源对象的副本。对新标准中的memcpy生命周期初始化规则有什么变化?

然而,在this thread从开放-STD WG21“UB”名单上的最后一年,一个参与者是指新的memcpy寿命萌生规则

这似乎并没有上升到错误报告的级别,但它可能与新的memcpy生存期启动规则相关。他们将 赋予源和目标字节一些静态类型?

基于该问题和类型擦除示例代码量小的情况下,似乎它可能与经由memcpy创建在aligned_storage新对象。

搜索尽我所能,我无法找到新规则的参考。我特别好奇它们是否适用于替换已经创建的对象的内容,或者它们是否改变了未初始化内存中潜在创建对象的情况。

+0

“_据我所知,未初始化存储中的memcpy不能安全地用于创建源对象的副本。”是的,但只有在杜鹃花严肃对待std的土地上。如果你知道委员会中的大多数人几乎不知道他们在做什么... – curiousguy

回答

4

措辞有所改变,但总体思路保持不变。从intro.object

一种对象由定义创建,由新表达,当隐式地改变联合的积极成员,或当创建的临时对象([conv.rval] ,[class.temporary])。

这些是只有四种方式来创建一个对象在C++中。 memcpy不属于这四个条件中的任何一个,因此它现在不会(现在也从未有过)创建寿命(隐式地更改工会的活动成员可以完成via = only,而不是通过memcpy)。

该引用指的是在某些情况下可以使用这种能力祝福memcpy的标准的假设未来更改。这一年的早些时候还有一个very long thread

+2

人。这不是讨论你认为语言应该做什么的正确的地方。 – Barry

+0

评论不适用于扩展讨论;这个对话已经[转移到聊天](http://chat.stackoverflow.com/rooms/157388/discussion-on-answer-by-barry-what-are-the-changes-if-any-to-the-the-change- memcpy的-lifeti)。 –

相关问题