使用 std::byte / unsigned char 数组和 std::construct_at 来提供存储是一个非常常见的示例。
//say A is a NON standard-layout class user-defined class
alignas(A) std::byte storage[sizeof(A)];
new (reintrepret_cast<A*>(storage)) A;
但是,std::construct_at 接受指向对象的指针,而如果您reintrepre_cast 指向std::byte / unsigned char 数组的指针,它仍然应该指向std::byte / unsigned char 数组的第一个成员。那么上面的代码违法吗?如果是这样,如何提供指向 std::construct_at 的有效指针?
您可以按如下方式使用 std::construct_at :
alignas(A) unsigned char storage[sizeof(A)];
A* ptr = std::construct_at(reinterpret_cast<A*>(storage));
// do stuff with ptr
std::destroy_at(ptr);
您可以查看以下页面以获取有关construct_at的更多信息:https://en.cppreference.com/w/cpp/memory/construct_at