提问人:JMC 提问时间:9/2/2023 更新时间:9/2/2023 访问量:51
为什么 std::aligned_storage 通过嵌套结构 “::type” 定义,而不是直接使用模板化类?
Why is std::aligned_storage defined through a nested struct "::type" rather than using the templated class directly?
问:
既标准在 http://eel.is/c++draft/depr.meta.types#11
和 cppreference 建议 的典型实现有点像这样(标准差异很小):std::aligned_storage
template<std::size_t Len, std::size_t Align = /* default alignment not implemented */>
struct aligned_storage
{
struct type
{
alignas(Align) unsigned char data[Len];
};
};
即通过公开包含实际数组的嵌套类型。这带来了用户错误地直接使用而不是 的危险,我相信这是它被弃用的原因之一。这种定义的原因可能是什么?为什么它不能被实现为std::aligned_storage
std::aligned_storage::type
template<size_t Len, size_t Alignment>
struct aligned_storage {
alignas(Alignment) unsigned char __data[Len];
};
?
关于“提供存储”等的标准规则是否需要这样的定义?
答: 暂无答案
评论
type
aligned_storage
已经在 2003 年 (N1519) 中首次添加到 C++ 中,并且在此之前它已经存在于 boost 中。 尚不可用,因此无论如何都无法实现。相反,它必须实现为具有适当对齐的内部类型的并集。虽然我想这并不能回答为什么需要外包装类型。也许只是因为当时添加的所有转换类型特征都是这样指定的(将输入作为模板参数,提供结果)?alignas
::type
std::aligned_storage
在 C++ 23 中已弃用。不要再投资了。而是使用 function 并将调用包装在类中,以获得所需的类型安全。std::aligned_alloc