C++ 在新标准中,memcpy生命周期初始化规则有哪些变化(如果有)?
据我所知,C++ 在新标准中,memcpy生命周期初始化规则有哪些变化(如果有)?,c++,language-lawyer,c++17,memcpy,object-lifetime,C++,Language Lawyer,C++17,Memcpy,Object Lifetime,据我所知,memcpy到未初始化的存储中可以安全地用于创建源对象的副本 然而,从去年开始,在开放式std WG21“ub”列表中,一名参与者提到了新的memcpy终身启动规则: 这似乎并没有上升到bug报告的级别,但它可能会 与新的memcpy寿命启动规则相关。他们会吗 是否将某些静态类型归因于源字节和目标字节 根据问题的上下文和少量类型擦除示例代码,它可能与通过memcpy在aligned_存储器中创建新对象有关 尽管我可能会搜索,但我找不到新规则的引用。我特别好奇的是,它们是否只适用于替换已
memcpy
到未初始化的存储中可以安全地用于创建源对象的副本
然而,从去年开始,在开放式std WG21“ub”列表中,一名参与者提到了新的memcpy终身启动规则:
这似乎并没有上升到bug报告的级别,但它可能会
与新的memcpy寿命启动规则相关。他们会吗
是否将某些静态类型归因于源字节和目标字节
根据问题的上下文和少量类型擦除示例代码,它可能与通过memcpy
在aligned_存储器中创建新对象有关
尽管我可能会搜索,但我找不到新规则的引用。我特别好奇的是,它们是否只适用于替换已创建对象的内容,或者它们是否改变了在未初始化内存中可能创建对象的情况。措辞有点变化,但总体思路保持不变。发件人:
通过定义、新表达式、隐式更改联合的活动成员或创建临时对象([conv.rval]、[class.temporary])创建对象
<>这是在C++中创建对象的四种方法。code>memcpy
不属于这四个条件中的任何一个,因此它现在(以前从未)创建生存期(可以通过memcpy
隐式更改联盟的活动成员)
该引文是指对标准的假设性未来变更,该变更将在某些情况下为
memcpy
提供这种能力。今年早些时候也有关于这个问题的讨论 在C++20中,措辞发生了更多变化。这一变化是基于自C++98(含C++98)以来所有版本的追溯性应用,因此,尽管这一措辞恰好出现在C++20规范中,但对于C++17以及C++98等仍然是如此
发件人:
C++程序中的构造创建、销毁、引用、访问和操纵对象。对象由定义、新表达式、隐式创建对象的操作创建(见下文)
另请参见。评论不用于扩展讨论;这个对话已经结束。@DavisHerring嗯,修改是基于它的,它追溯应用于自C++98(含C++98)以来的所有版本-在回答中添加了这个澄清。对不起,我的措辞太糟糕了。的确,这是一个DR,编译器将在所有语言版本中应用它(即使这超出了DR的正式功能)。然而,问题是关于C++17(已发布)中应该包含的更改,因此区分实际发生的情况(您现在已经做了!)很重要。