关于std::aligned_storage
模板,C ++标准规定了
对于某些类型Align
或默认对齐,
alignof(T)
应等于T
。
这是否意味着程序中必须存在这样的类型,或者必须能够制作这样的类型?特别是,cppreference上建议的possible implementation是
template<std::size_t Len, std::size_t Align /* default alignment not implemented */>
struct aligned_storage {
typedef struct {
alignas(Align) unsigned char data[Len];
} type;
};
似乎这个使成为具有该对齐的类型,如果可能的话(即,如果Align
是有效对齐)。是否需要该行为,或者如果此类型尚不存在,则指定Align
是未定义的行为吗?
而且,或许更重要的是,在实践中,在这种情况下编译器或标准库无法做正确的事情是合理的,假设Align
至少是一个类型的合法对齐?
答案 0 :(得分:2)
您始终可以尝试使用任意(有效)对齐N
来创建类型:
template <std::size_t N> struct X { alignas(N) char c; };
当N
大于默认对齐时,X
已扩展对齐。对扩展对齐的支持是实现定义的,[dcl.align]说:
如果常量表达式未计算为对齐值(6.11),或计算为扩展值 对齐和实现不支持在声明的上下文中的对齐,程序是不正确的。
因此,当您尝试对X<N>
说明不支持的扩展对齐时,您将面临诊断。您现在可以使用X<N>
的存在(或其他方式)来证明专业化aligned_storage<Len, N>
的有效性(其条件现在符合T = X<N>
)。
由于aligned_storage
会在内部有效地使用X
,因此您甚至不必实际定义X
。这只是解释中的心理辅助。如果不支持请求的对齐,aligned_storage
将会格式不正确。