gpt4 book ai didi

c++ - C++20中隐式创建对象,理解提案的类型双关例子

转载 作者:行者123 更新时间:2023-12-01 14:39:31 25 4
gpt4 key购买 nike

我试图完全理解 C++20 的一个新特性,隐式创建对象。

proposal中有这个例子, “3.3 类型双关语”部分:

We do not wish examples such as the following to become valid:

float do_bad_things(int n) {
alignof(int) alignof(float) char buffer[max(sizeof(int), sizeof(float))];
*(int*)buffer = n; // #1
new (buffer) std::byte[sizeof(buffer)]; // #X
return (*float*)buffer; // #2
}

The proposed rule would permit an int object to spring into existence to make line #1 valid (in each case), and would permit a float object to likewise spring into existence to make line #2 valid.



为什么标有#X(由我)的行是必要的?这有什么不同吗?如果没有这条线,这个例子会不会完全一样?

我的推理是: buffer是一个字符数组,所以它隐式地创建对象。因此,在第 1 行,一个 int是隐式创建的。同样,在第 2 行,一个 float被隐式创建,即使没有 #X 行(因为 buffer 已经具有隐式创建对象属性)。所以看起来#X 行没有添加任何内容。我错了吗?

最佳答案

Why is the line marked #X (by me) necessary?



因为这会调用隐式对象创建。

C++20 中的隐式对象创建 (IOC) 并不困惑。它不是“每个对象每次都存在于每个可能的内存位置”。它是一种量子状态:当在一块内存上调用 IOC 规则时,会创建一个对象。你只是不知道它是什么。当您实际将内存用于特定对象时,结果证明这是在内存上调用 IOC 时创建的对象(或与之兼容的对象)。

如果你对存储做了任何事情,以至于单个对象不能同时满足两者,那么你就会得到 UB。

一块内存不能容纳 int和一个 float同时在他们的有生之年。国际奥委会不会改变这一点。

第 1 行使用 IOC 创建一个 int在存储中;在这一点上,它在功能上与 int buffer; 没有区别。 .第 2 行尝试访问 float在那个存储中,但不存在这样的对象。如果有 int已经存在,国际奥委会无法创建 float在它的上面。

X 行通过重用存储来结束该内存中所有对象的生命周期;没有 int没有了。并且由于正在创建的对象是 byte阵列,这也为IOC的存储重新加持。这就是第 2 行工作的原因。

关于c++ - C++20中隐式创建对象,理解提案的类型双关例子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61441744/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com