使用std::construct_at操作std::byte/unsigned char数组的合法性疑问
代码合法性分析与正确写法
原代码是否非法?
这段代码是合法的,原因如下:
alignas(A)确保了storage数组的对齐要求完全匹配类A的对齐需求,sizeof(A)则保证存储区域的大小足够容纳一个A对象,满足构造A的前置条件。reinterpret_cast<A*>(storage)的转换是标准允许的:由于storage指向的内存对齐和大小都符合A的要求,将指向std::byte的指针转换为A*,本质是获取了一块适合构造A对象的存储地址。std::construct_at的核心作用就是在未初始化的合法存储上构造对象,这里转换后的指针虽然源自数组首元素,但只要存储条件满足,就可以作为构造的目标地址。构造完成后,这块内存的生命周期归新创建的A对象所有,原std::byte数组的平凡类型元素会被覆盖,不存在生命周期冲突。
更严谨的写法
如果要进一步消除指针转换的歧义,更明确地表达“获取存储区域的起始地址”,可以用void*中转转换(语义更清晰):
alignas(A) std::byte storage[sizeof(A)]; // 用void*中转的写法,语义更明确 A* ptr = static_cast<A*>(static_cast<void*>(storage)); std::construct_at(ptr, A{});
当然原写法本身就是符合标准的常见用法,完全可以正常使用。
内容的提问来源于stack exchange,提问作者minex
相关产品推荐
相关产品推荐

