如何解释std::launder的可达性要求?
How to interpret the reachability requirement of std::launder?
std::launder
函数要求通过结果可以访问的每个字节都可以通过参数访问。"可访问"的定义如下:
字节可以通过指向对象Y的指针值访问,如果该对象位于Y占用的存储内,则该对象是 指针可与 Y 互转换,如果Y是数组元素,则立即封闭的数组对象。
根据对另一个问题的回答,这种限制"......意味着您不能使用launder
来获取允许您访问比源指针值允许的更多的字节的指针,这会导致未定义的行为。
这对于 T.C. 给出的示例是有意义的,但我不明白在原始对象被新对象替换的情况下如何解释它,这是std::launder
考虑的原始目的。该标准具有以下示例:
struct X { const int n; };
X *p = new X{3};
const int a = p->n;
new (p) X{5}; // p does not point to new object (6.8) because X::n is const
const int b = p->n; // undefined behavior
const int c = std::launder(p)->n; // OK
在这种情况下,当调用std::launder
时,p
---原始X
对象---指向的对象已经不复存在,因为在它占用的存储中创建一个新对象已经隐式地结束了它的生存期([basic.life]/1.4(。因此,似乎没有字节可以通过p
访问,因为p
不指向任何对象Y。这显然不是预期的读数,因为它会调用示例中std::launder
未定义的行为。
- 我是否误解了这里的措辞,还是措辞有缺陷? 使
- 示例有效的预期含义是什么?
仅凭示例,相关文本是(粗体是我的(:
可以通过指向的指针值访问存储字节 对象 Y(如果它位于 Y 占用的存储内(
由于放置了 new,指针值现在指向"新放置"的对象,因此可访问性是这样的。
我想说,就目前而言,这一点已经足够清楚了。
相关文章:
- C++Union/Struct位域的实现和可移植性
- BOOST_DATA_TEST_CASE总是要求样品的可打印性吗?
- 静态库可移植性
- 提升 Websocket 并io_context可重用性,以实现连接的可重新建立性
- C++:Unicode 字符串文字的可移植性
- 如何使Visual Studio 2017 C++项目在计算机之间更具可移植性
- 如何将抽象类的可访问性限制为另一个抽象类及其子类?
- 如何解释std::launder的可达性要求?
- 手动SIMD代码可负担性
- 在为视频游戏实施基本的二进制序列化时,请担心可移植性
- 根据另一个数字的可整除性返回子数组中的索引
- 类内非静态字段初始化 + 对象池 - >降低可维护性/可读性
- 朋友功能可访问性问题
- 重写类以使其更通用,以实现可移植性
- 为什么类型可转换性C++不传递
- Qt C++项目中来自 Xamarin 项目的代码的可重用性
- Visual Studio 2015 <=> QtCreator 5 (c++) 代码可移植性
- 继承:派生类的基类属性可访问性
- 通过虚拟接口类导出C 类的可移植性
- 静态函数作为类模板参数-导致可维护性问题