新标准中对memcpy生命周期初始化规则有哪些更改(如果有的话)

What are the changes, if any, to the memcpy lifetime initalization rules in the new standard?

本文关键字:如果 规则 周期 标准 memcpy 新标准 生命 初始化      更新时间:2023-10-16

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

然而,在去年开放的std WG21"ub"列表上的这个线程中,一名参与者提到了新的memcpy生命周期启动规则

这似乎没有上升到错误报告的级别,但它可能与新的memcpy生存期启动规则相关。他们会吗将某种静态类型归因于源字节和目标字节?

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

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

措辞有所改变,但总体思路保持不变。来自简介。主题:

对象是由定义、新表达式、隐式更改联合的活动成员或创建临时对象([conv.rval]、[class.temporary])时创建的。

这是在C++中创建对象的四种方法。memcpy不属于这四个条件中的任何一个,因此它现在(以前也从未)创建生存期(只能通过=而不能通过memcpy隐式地更改联合的活动成员)。

这句话指的是对标准的假设性未来更改,该更改将使memcpy在某些情况下具有这样的能力。今年早些时候,关于这个问题也有很长的线索。

C++20中的措辞发生了更多变化。这一变化是基于p0593r6,它追溯应用于自C++98以来的所有版本,因此,尽管该措辞恰好出现在C++20规范中,但对于C++17和C++98等来说仍然如此。

来自简介。主题:

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

。。。

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

另请参阅此SO答案。

相关文章: