Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在新标准中,memcpy生命周期初始化规则有哪些变化(如果有)?_C++_Language Lawyer_C++17_Memcpy_Object Lifetime - Fatal编程技术网

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(已发布)中应该包含的更改,因此区分实际发生的情况(您现在已经做了!)很重要。