Reinterpret_cast 和平凡的默认构造函数:未定义行为之旅
cppreference 文档曾经声称可以使用以下命令创建平凡的默认可构造对象在适当对齐的内存上进行reinterpret_cast。然而,此断言后来被修改,以强调使用placement-new显式初始化此类对象的要求。
生命周期之谜
如果reinterpret_cast确实创建了对象,我们会遇到关于他们一生的困境。转换操作本身会标志着对象的开始吗?或者它会更早发生,当使用像alignas(X) char buffer[sizeof(X)]这样的表达式分配存储时?
在后一种情况下,它提出了一个有趣的可能性,即存储之间的条件语句分配和转换可能会构造一个 X 对象或其他一些简单的默认可构造实体 Y。
澄清指南标准
不幸的是,C 标准明确排除了这种无定形对象的创建。根据 [intro.object]/1,对象只能通过定义、new 表达式、激活联合体的活动成员或创建临时对象来产生。
甚至不是空的存在
空的初始化生命周期的概念与这种情况无关。为了应用这个概念,一个对象必须首先存在,但这里不是这种情况。
始终未定义
纵观 C 的历史,reinterpret_casting 的行为微不足道默认可构造对象始终未定义。 C 11 和 C 1z 都遵循不同的对象必须具有不同的地址的基本原则,这使得在同一存储中创建多个对象成为薛定谔猫般的悖论。
结论
reinterpret_cast 操作并不是创建对象的神奇工具。在尝试调用其创造力时,程序员冒着调用未定义行为并将其代码陷入不可预测的危险深渊的风险。
以上是`reinterpret_cast` 何时实际创建对象?的详细内容。更多信息请关注PHP中文网其他相关文章!