标准库的哪些部分现在将被标记为 constexpr?
从我为 C++14, N3690查看的草稿中,到目前为止,以下内容将更改为constexpr
(与 C++11 标准相比)†:
std::error_category
的默认构造函数
std::forward
std::move
std::move_if_noexcept
- 所有
std::pair
的运算符比较
std::get
对于std::pair
和std::tuple
。
std::make_tuple
- 所有
std::tuple
的运算符比较
- 所有
std::optional
的运算符比较
- 所有
std::optional
的构造函数(移动除外)
operator[]
和size
forstd::bitset
和其他容器。
- 所有
std::complex
的运算符比较
†由于我手动执行此操作,您可能会遇到一些错误 :(
对于另一个可能更正确的constexpr
添加列表,您可以检查:N3469、N3470和N3471
哪些其他部分可以标记为 constexpr?
大多数可能的东西constexpr
(std::numeric_limits
评估std::tuple
和std::pair
构造函数等)已经被标记为constexpr
C++11 标准。存在一个错误,其中std::ratio
的时间点和其他组件未标记为,constexpr
但已在 N3469 中修复。
将从constexpr
添加中受益的东西是std::initializer_list
,这一次没有得到任何东西(我不确定是否有任何建议允许它)。
是否有向后兼容的理由不这样做?
由于这是一个扩展,大多数东西都不会被破坏,因为旧代码仍将按原样编译,并且现在没有任何格式错误。但是constexpr
,如果您没有预料到,添加到没有它的旧东西可能会导致一些令人惊讶的结果,例如此处提供的示例(感谢 TemplateRex)