为什么 std::aligned_storage 通过嵌套结构 “::type” 定义,而不是直接使用模板化类?

Why is std::aligned_storage defined through a nested struct "::type" rather than using the templated class directly?

提问人:JMC 提问时间:9/2/2023 更新时间:9/2/2023 访问量:51

问:

既标准在 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_storagestd::aligned_storage::type

template<size_t Len, size_t Alignment>
struct aligned_storage {
    alignas(Alignment) unsigned char __data[Len];
};

?

关于“提供存储”等的标准规则是否需要这样的定义?

C++ 模板 类型 language-lawyer

评论

0赞 BoP 9/2/2023
您已经链接到需求 - 是正确对齐的 typedef。就这样。其余的只是一个例子。请注意,C++1 已经酝酿了 13 年,早期提出的一些功能可能在发布之前就已经过时了......type
0赞 user17732522 9/2/2023
aligned_storage已经在 2003 年 (N1519) 中首次添加到 C++ 中,并且在此之前它已经存在于 boost 中。 尚不可用,因此无论如何都无法实现。相反,它必须实现为具有适当对齐的内部类型的并集。虽然我想这并不能回答为什么需要外包装类型。也许只是因为当时添加的所有转换类型特征都是这样指定的(将输入作为模板参数,提供结果)?alignas::type
0赞 user17732522 9/2/2023
"关于“提供存储”等的标准规则是否需要这样的定义?“:”提供存储“的概念是在很久以后才在C++17中添加的。
0赞 Red.Wave 9/3/2023
std::aligned_storage在 C++ 23 中已弃用。不要再投资了。而是使用 function 并将调用包装在类中,以获得所需的类型安全。std::aligned_alloc

答: 暂无答案