在不创建显式对象的情况下强制转换和访问隐式生存期类型有效吗


char* t = (char*)malloc(sizeof(float) * 2);
*(float*)t = 1.0f; // or *reinterpret_cast<float*>(t) = 1.0f;
*((float*)t + 1) = 2.0f; // #1

在一些SO问题中,有答案表明,由于严格的混叠违规,上述代码是未定义的行为。

但是,我最近读了P0593的论文
我认为这篇论文是在说,如果您使用某些操作分配/获得一些存储
(例如定义字符/字节数组、malloc、运算符new…(,
您可以将存储本身视为隐式生存期类型并使用,而无需显式对象创建,因为您想要的隐式类型将隐式创建。

  1. 如果我的想法是正确的,那么上面的代码现在不是违反了严格的别名规则吗
  2. 在上面的代码中,是否隐式创建了浮点数组对象
    (如果不是,#1是UB,因为我在不是数组的存储上尝试了指针运算(

(如果你听不懂我在说什么,请告诉我……我英语不好……(

是的,代码是合法的,并且对象是隐式创建的。(从C++20开始(

我怀疑你是否需要std::launder。似乎不是,malloc隐式地执行它(注意"返回一个指向合适创建对象的指针"(。

最新更新