C++20 "transparently replaceable"关系

标签 c++ language-lawyer c++20

在 C++20 的最终工作草案(以及下面链接的最新公开可用草案)中,关于如何允许对象替换其他对象,[basic.life] 的措辞已经改变,以便指针、引用和对象的name 自动引用新对象。为此,引入了“透明可替换”的关系。但是,我不确定我是否正确理解了这一点。考虑这个例子:

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 对象,也不是具有 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 而不是一个新的 X)?
或者是否可以因为[intro.object]\2的措辞而争论新的 int 是 x 的子对象,就像旧的 int,(我高度怀疑这是预期的解释,tbh),因此 x 在定义中同时满足 p1 和 p2 的角色,并且是 x 然后“透明可替换”与自身,这意味着(8.5)得到满足?
或者即使不涉及 const 限定,现在也需要 std::launder 的意图是什么?

最佳答案

无论 [basic.life]p8 是否适用,[intro.object]p2 都适用,因此 o1 和 o2 是同一对象的直接子对象。你可以很容易地检查一个对象是否总是透明地由它自己替换,所以 p1 透明地替换了 p2,所以 o1 透明地替换了 o2。
这符合意图,即狭隘地解决国家机构评论 US041关于 C++20 委员会草案。具体来说,在 [intro.object]p2 不适用的情况下(例如,因为被替换的对象是基类子对象而不是数组元素或成员子对象),就不能再访问新创建的(完整)对象就好像它是另一个对象的子对象一样。

关于C++20 "transparently replaceable"关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63795395/

相关文章:

c++ - 范围 View 大小不编译

c++ - 根据多个条件对结构进行排序?

c++ - 如果使用constexpr,是否可以删除控制流语句?

c++ - 为什么计算 future 方向上从工作日 y 到工作日 x 的一天距离必须如此复杂?

C++11:是什么阻止存储提升超过锁的临界区的开始?

c++ - 位字段和值初始化导致缓冲区溢出 - 编译器错误或未定义的行为?

c++ - "used as non-type template parameter"是否使函数模板隐式实例化?

c++ - 如何在main之外的函数中访问数组?

c++ - 将构成特定任务工具箱的函数分组为类是个好主意吗?

c++ - PySide 中的多线程 Boost Python C++ 代码