Since P0593 为低级对象操作隐式创建对象 https://github.com/cplusplus/papers/issues/106已被接受,现在可以创建对象隐含地在 C++20 中。
具体来说,该提案引入的措辞允许某些操作(例如std::malloc
)自动创建某些类型的对象并启动其生命周期,即所谓的隐式生命周期类型, if引入此类对象将导致具有未定义行为的程序具有已定义的行为。看[介绍对象]/10 https://eel.is/c++draft/basic#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
s, ...
创建哪个集合是不可观察的,因为如果有任何实际观察,就会将可能性减少到仅那些有效的集合。如果我们做了类似的事情p[1]->a = 3
那么可能性的宇宙就会崩溃到只剩下一个和两个X
s.
换句话说,只有当程序中没有足够的观察来区分它们的有效性时,才可能存在多组隐式创建的对象。如果有一种方法可以区分,那么根据定义,它们就不会都是有效的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)