C++20 "transparently replaceable" 关系
C++20 "transparently replaceable" relation
在 C++20 的最终工作草案(以及下面链接的最新公开可用草案)中,[basic.life] 的措辞已针对如何允许对象替换其他对象进行了更改,因此指针、引用和对象名称自动引用新对象。为此,引入了“透明可替换”的关系。但是,我不确定我是否理解正确。考虑这个例子:
struct X {int a = 3; float b;};
X x;
new(&x.a) int(5);
x.a == 5 // true without std::launder?
在 C++17 中,这当然是正确的,因为旧的 int 既不是 const 对象,也class 具有 const 非静态成员。
然而,现在新的 transparently replaceable 关系可能不再允许这样做。考虑新旧int对象的关系时,条件(8.1)到(8.4)都满足了,但是条件(8.5)呢?
either o1 (the old int) and o2 (the new int) are both complete objects (the old int was definitely a subobject, so this part is false) or o1 and o2 are direct subobjects of objects p1 and p2, respectively, and p1 is transparently replaceable by p2.
new int 是一个完整的对象吗,因为它是“独立”构建的(我们只放置了一个 new int 而不是一个 new X)?
或者可以说,由于 [intro.object] 的措辞,新的 int 是 x 的子对象,就像旧的 int 一样,(我高度怀疑这是预期的解释,tbh)和因此 x 在定义中同时满足 p1 和 p2 的角色,然后 x 可以“透明地替换”自身,这意味着满足 (8.5)?
或者这现在需要 std::launder 的意图是即使不涉及任何 const-qualified?
无论 [basic.life]p8 是否适用,[intro.object]p2 都适用,因此 o1 和 o2 是同一对象的直接子对象。你可以很容易地检查一个对象总是透明地被它自己替换,所以 p1 透明地替换 p2,所以 o1 透明地替换 o2。
这符合意图,即狭义地解决国家机构对 C++20 委员会草案的评论 US041。具体来说,在 [intro.object]p2 不适用的情况下(例如,因为被替换的对象是基础 class 子对象而不是数组元素或成员子对象),您将无法再访问newly-created(完整)对象,就好像它是另一个对象的子对象一样。
在 C++20 的最终工作草案(以及下面链接的最新公开可用草案)中,[basic.life] 的措辞已针对如何允许对象替换其他对象进行了更改,因此指针、引用和对象名称自动引用新对象。为此,引入了“透明可替换”的关系。但是,我不确定我是否理解正确。考虑这个例子:
struct X {int a = 3; float b;};
X x;
new(&x.a) int(5);
x.a == 5 // true without std::launder?
在 C++17 中,这当然是正确的,因为旧的 int 既不是 const 对象,也class 具有 const 非静态成员。
然而,现在新的 transparently replaceable 关系可能不再允许这样做。考虑新旧int对象的关系时,条件(8.1)到(8.4)都满足了,但是条件(8.5)呢?
either o1 (the old int) and o2 (the new int) are both complete objects (the old int was definitely a subobject, so this part is false) or o1 and o2 are direct subobjects of objects p1 and p2, respectively, and p1 is transparently replaceable by p2.
new int 是一个完整的对象吗,因为它是“独立”构建的(我们只放置了一个 new int 而不是一个 new X)?
或者可以说,由于 [intro.object] 的措辞,新的 int 是 x 的子对象,就像旧的 int 一样,(我高度怀疑这是预期的解释,tbh)和因此 x 在定义中同时满足 p1 和 p2 的角色,然后 x 可以“透明地替换”自身,这意味着满足 (8.5)?
或者这现在需要 std::launder 的意图是即使不涉及任何 const-qualified?
[intro.object]p2 都适用,因此 o1 和 o2 是同一对象的直接子对象。你可以很容易地检查一个对象总是透明地被它自己替换,所以 p1 透明地替换 p2,所以 o1 透明地替换 o2。
这符合意图,即狭义地解决国家机构对 C++20 委员会草案的评论 US041。具体来说,在 [intro.object]p2 不适用的情况下(例如,因为被替换的对象是基础 class 子对象而不是数组元素或成员子对象),您将无法再访问newly-created(完整)对象,就好像它是另一个对象的子对象一样。