在没有显式创建对象的情况下转换和访问隐式生命周期类型是否有效?

Is it valid to cast and access to implicit-lifetime types without explicit object creation?

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
我认为这篇论文是在说如果你 allocate/obtain 使用某些操作进行一些存储
(比如定义char/byte数组,malloc,operator new,...),
您可以将存储本身视为隐式生命周期类型,而无需显式创建对象,因为您想要的隐式类型将被隐式创建。

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

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

是的,代码是合法的,对象是隐式创建的。 (C++20 起)

我怀疑你是否需要std::launder。似乎不是,malloc does it implicitly(注意“return 指向合适的已创建对象的指针”)。