gpt4 book ai didi

c++ - 未指定的隐式对象创建

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

P0593 Implicit creation of objects for low-level object manipulation已被接受,现在可以在 C++20 中隐式创建对象。

具体而言,提案中引入的措辞允许某些操作(例如 std::malloc )自动创建并启动某些类型对象的生命周期,即所谓的隐式生命周期类型,如果引入此类对象会导致程序在其他情况下未定义行为具有定义的行为。见 [intro.object]/10 .

该草案现在进一步指出,如果可以隐式创建多个此类对象集以提供程序定义的行为,则未指定创建这些对象中的哪一个。 (相关句子似乎没有出现在我可以访问的最后一个提案修订版中,R5,但在提交草案中。)

实际上是否有一个程序可以观察到这种隐式创建的对象集的选择?换句话说,是否有一个程序通过这个新规则定义了但未指定的行为,以便可以从输出中推断出哪些类型的隐式对象(从多个可能的对象中)被创建?

还是这句话只是为了澄清抽象机器上的程序执行(没有可观察到的影响)?

最佳答案

我们以标准中的例子为例,稍微改动一下:

#include <cstdlib>
struct X { int a, b; };
X *make_x() {
// The call to std::malloc implicitly creates an object of type X
// and its subobjects a and b, and returns a pointer to that X object
// (or an object that is pointer-interconvertible ([basic.compound]) with it),
// in order to give the subsequent class member access operations
// defined behavior.
X *p = (X*)std::malloc(sizeof(struct X) * 2); // me: added the *2
p->a = 1;
p->b = 2;
return p;
}

以前,只能在该存储中隐式创建一组有效对象 - 它必须恰好是一个 X .但是现在,我们有两个 X 的存储空间s,但只写入其中之一,并且该程序中的任何内容都不会触及其余字节。因此,可以隐式创建许多不同的对象集 - 可能是两个 X s,也许是 X和两个 int s,也许是 X和八 char斯,...

创建哪个集合是不可观察的,因为如果有任何实际观察,那会将可能性减少到只有那些有效的集合。如果我们做类似 p[1]->a = 3 的事情然后可能性的宇宙崩溃到只有两个的一个 X s。

换句话说,只有当程序中没有足够的观察来区分它们的有效性时,多组隐式创建的对象才有可能。如果有办法区分,那么根据定义,它们不会都是有效的。

关于c++ - 未指定的隐式对象创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60626834/

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