可以使用C++ 14标准库的哪些部分以及哪些部分将成为constexpr?

Tem*_*Rex 32 c++ backwards-compatibility constexpr c++11 c++14

使用新的轻松的C++ 14 constexpr规则,编译时编程变得更具表现力.我想知道标准图书馆是否也会升级以便利用.特别是std::initializer_list,std::pair,std::tuple,std::complex,std::bitsetstd::array看起来像总理候选人须注明constexpr批发.

问题:

  • 其标准库的部分现在被标记constexpr
  • 哪些其他部分可以标记constexpr
  • 例如,为什么不是来自<cmath><algorithm>标记的功能constexpr
  • 是否有向后兼容的原因不这样做?

Rap*_*ptz 26

标准库的哪些部分现在将标记为constexpr?

从我为C++ 14,N3690查看的草案,constexpr到目前为止将改变以下(与C++ 11标准相比)†:

  • std::error_category的默认构造函数
  • std::forward
  • std::move
  • std::move_if_noexcept
  • 所有std::pair的运营商比较
  • std::getstd::pairstd::tuple.
  • std::make_tuple
  • 所有std::tuple的运营商比较
  • 所有std::optional的运营商比较
  • 所有std::optional的构造者(除了移动)
  • operator[]sizestd::bitset等容器.
  • 所有std::complex的运营商比较

由于我手动执行此操作,您可能会遇到一些错误:(

对于另一个可能更正确的constexpr添加列表,您可以检查:N3469,N3470N3471

哪些其他部分可以标记为constexpr?

大多数可能的东西constexpr(std::numeric_limits评估std::tuplestd::pair构造函数等)已经标记为constexprC++ 11标准.有一个错误,其中std::ratio的时间点和其他组件没有标记为,constexpr但它已在N3469中修复.

可以从constexpr增加中受益的东西std::initializer_list,这次没有得到任何东西(我不确定是否有任何提议允许它).

是否有向后兼容的原因不这样做?

由于这是一个扩展,大多数东西都不会被破坏,因为旧的代码仍然会按原样编译,现在什么都没有形成.但是,添加constexpr到没有它的旧东西可能会导致一些令人惊讶的结果,如果你没想到它,例如这里提供的例子(谢谢TemplateRex)