想要在编译时比较 std::array
是
非常自然的;而且它的
operator==()
显然是 constexpr
'able 的。然而 - 它没有标记为constexpr
。这是有意为之还是疏忽?而且 - 这样做的原因是什么(显然在 C++17 中也是如此)?
P0031解释了为什么它没有提出
constexpr
比较:
目前比较和
/swap
可以在帮助下实现 来自fill
标头的算法。标记比较与 constexpr 将破坏这种能力并可能导致 性能下降。<algorithm>
例如,
==
可以用std::equal
来实现,在适当的情况下,它可以称为高度优化但决定不-constexpr
memcmp
。将 constexpr
替换为 ==
将排除这种优化,无需特殊的编译器帮助。
基本原理可能是这样的:如果包含类型的
==
也是 constexpr
,则数组的 ==
只能是 constexpr
。
由于容器无法强制执行这一点,因此它(通常)不能提供
operator==() constexpr
。