新标准中对memcpy生命周期初始化规则有哪些更改(如果有的话)
What are the changes, if any, to the memcpy lifetime initalization rules in the new standard?
据我所知,未初始化存储中的memcpy
不能安全地用于创建源对象的副本。
然而,在去年开放的std WG21"ub"列表上的这个线程中,一名参与者提到了新的memcpy生命周期启动规则:
这似乎没有上升到错误报告的级别,但它可能与新的memcpy生存期启动规则相关。他们会吗将某种静态类型归因于源字节和目标字节?
根据问题的上下文和少量类型擦除示例代码,它似乎与通过memcpy
在aligned_storage
中创建新对象有关。
尽管我可能会搜索,但我找不到对新规则的引用。我特别好奇的是,它们是否只适用于替换已经创建的对象的内容,或者是否改变了在未初始化内存中潜在创建对象的情况。
措辞有所改变,但总体思路保持不变。来自简介。主题:
对象是由定义、新表达式、隐式更改联合的活动成员或创建临时对象([conv.rval]、[class.temporary])时创建的。
这是在C++中创建对象的四种方法。memcpy
不属于这四个条件中的任何一个,因此它现在(以前也从未)创建生存期(只能通过=
而不能通过memcpy
隐式地更改联合的活动成员)。
这句话指的是对标准的假设性未来更改,该更改将使memcpy
在某些情况下具有这样的能力。今年早些时候,关于这个问题也有很长的线索。
C++20中的措辞发生了更多变化。这一变化是基于p0593r6,它追溯应用于自C++98以来的所有版本,因此,尽管该措辞恰好出现在C++20规范中,但对于C++17和C++98等来说仍然如此。
来自简介。主题:
- C++程序中的构造创建、销毁、引用、访问和操作对象。对象是由定义、新表达式、通过隐式创建对象的操作创建的(请参见下文)
。。。
- 此外,在存储,一些操作被描述为生成指向合适的创建对象。这些操作选择隐式创建的对象,其地址是起始地址存储区域的,并生成指向的指针值如果该值将导致程序定义行为如果没有这样的指针值将给出程序定义行为,程序的行为是未定义的。如果多次这样指针值将给出程序定义的行为,它是未指明产生哪一个这样的指针值
另请参阅此SO答案。
相关文章:
- 如果没有malloc,链表实现将失败
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- 此代码是否违反一个定义规则
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- 生成文件不对文件使用隐式规则
- 如果编译的源代码是特定于它编译的硬件的,我们如何分发它
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- C++擦除(如果存在)
- 如果"new int"返回"int*",那么为什么"new int[n]"不返回"int**"?
- 在'如果'陈述输出如何正确
- 变量可能尚未初始化[MIRA 2012规则9.1,强制性]
- 如果用户输入无效,如何使用字符串变量-C++重复输入命令
- 新标准中对memcpy生命周期初始化规则有哪些更改(如果有的话)
- 如果操作符右侧">>"失败,如何使规则失败,在提升精神气中
- 如果两条规则相匹配,如何让野牛使用一条规则
- 是否有例外的规则,如果地址可以使用 &它是左值?