如何用 std::byte[] 替换aligned_storage<T[]>?

Til*_*nnZ 5 c++ alignas

C++23 中已弃用的使用aligned_storage,建议用对齐方式替换std::byte[](请参阅此处)。我对此有两个问题:

1.如何对齐?

该文件建议更换

std::aligned_storage_t<sizeof(T), alignof(T)> t_buff;

alignas(T) std::byte t_buff[sizeof(T)]

然而,我实际上存储的是一个 T 数组(或者 T 是一个数组)。我可以简单地替换 std::aligned_storage_t<sizeof(T), alignof(T)> data_[SIZE];

alignas(alignof(T)*SIZE) std::byte data_[sizeof(T) * SIZE];

我认为这是错误的用法alignas吗?

2. 如何读/写?

我认为访问权限没有太大变化,因此阅读是否正确:

reference data(size_t index) noexcept {
    return *std::launder(reinterpret_cast<T*>(&data_[index*sizeof(T)]));
}
Run Code Online (Sandbox Code Playgroud)

并写与

new (reinterpret_cast<void*>(&data_[size_*sizeof(T)])) T{std::forward<Args>(args)...};

我为什么要问?

我的使用alignas似乎确实错误,我应该如何对齐它?我真的可以将访问索引与 相乘sizeof(T),还是需要考虑填充?如何?

另外,代码似乎比以前更糟糕,因为我必须sizeof()到处插入。

当我运行它时它似乎有效,但我不确定这是否真的保存。

我查看了其他示例(例如,此处此处和其他示例),但它们总是T以而不是T[]作为示例。

Nat*_*ica 8

您不需要做任何不同的事情。根据[expr.alignof]/3 的对齐方式T[N]是 的对齐方式T,因此您可以使用

alignas(T) std::byte data_[sizeof(T) * SIZE];
Run Code Online (Sandbox Code Playgroud)

您也可以只使用数组本身的对齐方式和大小,例如

alignas(T[SIZE]) std::byte t_buff[sizeof(T[SIZE])]
Run Code Online (Sandbox Code Playgroud)