使用新的relaxed C++14 constexpr rules,编译时编程变得更具表现力。我想知道标准图书馆是否也会升级以便利用。特别是,std::initializer_list
,std::pair
,std::tuple
,std::complex
,std::bitset
和std::array
似乎是标记constexpr
的主要候选人批发。
问题:
constexpr
? constexpr
? <cmath>
和<algorithm>
标记为constexpr
的功能不是? 答案 0 :(得分:26)
标准库的哪些部分现在将标记为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
代表std::bitset
和其他容器。std::complex
的运算符比较†由于我手动执行此操作,您可能会遇到一些错误:(
对于另一个可能更正确的constexpr
添加列表,您可以查看:N3469,N3470和N3471
哪些其他部分可以标记为constexpr?
大多数可能是constexpr
(std::numeric_limits
评估,std::tuple
和std::pair
构造函数等)的内容已在C中标记为constexpr
++ 11标准。有一个错误,其中std::ratio
的时间点和其他组件未标记为constexpr
但在N3469中已修复。
从constexpr
添加中受益的东西是std::initializer_list
,这次没有得到任何东西(我不确定是否有任何建议允许它)。
是否存在向后兼容的原因而不这样做?
由于这是一个扩展,大多数东西都不会被破坏,因为旧代码仍然会按原样编译,现在什么都不是格式错误。但是,如果您没有预期,那么将constexpr
添加到没有它的旧事物可能会导致一些令人惊讶的结果,例如示例provided here(感谢TemplateRex)
答案 1 :(得分:4)
上周(2013年9月23日至28日),标准委员会将constexpr
添加到标准库中的更多例程中。
operator ()
方法。 (less
,greater
,plus
,minus
,bitwise_and
,logical_or
,not1
- 其余的)@TemplateRex:我们在编译时越来越接近排序数组了。
然而,我们还解决了2013年LWG问题,指出标准库实施者无法自由地将标准中未定义的调用constexpr
作为constexpr
进行调用,因为这种差异实现之间可能会改变某些代码的行为。