`std::alignment_of` 与 `alignof`

`std::alignment_of` versus `alignof`

我刚刚偶然发现了 std::alignment_of type trait, and its soon-to-be friend std::alignment_of_v. They seem to have been specifically designed to be equivalent to a plain call to alignof,未来添加的 _v 助手表明它不仅仅是一个遗留位。

当我们有 alignof 时,std::alignment_of (_v) 有什么用?

std::alignment_of 作为 Boost 类型特征库的端口引入。它早于 C++11 和 alignof 关键字。该特征已被 alignof 运算符取代,但主要出于兼容性目的而保留(因此您可以将 boost:: 替换为 std::)并引入 _v 变量别名以保持一致性与图书馆的其他部分。

它们几乎完全是多余的。正如@Revolver 指出的那样,它们是在不同的论文中介绍的,并且 alignment_of 几乎逐字地来自 boost

但这并不意味着该特质没有用。

A template<class...>class 可以传递给其他 template 并与元编程一起使用。 alignof 之类的运算符不能:您必须先编写 template<class>class alignment_of 才能将其传递给元编程工具。

现在 sizeof 需要一个 std::size_of<class> 模板也是如此。

...

_v是因为扫了每个::valueintegral_constant类型的模板在std里面加了一个_v 变量模板。考虑哪些值得,哪些不值得,这将是自行车棚粉刷,几乎毫无意义:做每一个比花精力挑选值得做的要容易。它正在完成并不能证明该功能没有过时。

我在实践中发现的一件好事是 alignof 对于旧代码在语法上是无效的,而 alignment_of 只是一个标准模板。因此,您可以通过使用您的编译器接受的任何替代语法提供 alignment_of 的实现来保持与旧编译器的兼容性,然后在任何地方使用它。