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

时间:2013-08-05 06:57:46

标签: c++ c++11 backwards-compatibility constexpr c++14

使用新的relaxed C++14 constexpr rules,编译时编程变得更具表现力。我想知道标准图书馆是否也会升级以便利用。特别是,std::initializer_liststd::pairstd::tuplestd::complexstd::bitsetstd::array似乎是标记constexpr的主要候选人批发。

问题

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

2 个答案:

答案 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::pairstd::tuple
  • std::make_tuple
  • 所有std::tuple的运算符比较
  • 所有std::optional的运算符比较
  • 所有std::optional的构造函数(另存为移动)
  • operator[]size代表std::bitset和其他容器。
  • 所有std::complex的运算符比较

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

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

  

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

大多数可能是constexprstd::numeric_limits评估,std::tuplestd::pair构造函数等)的内容已在C中标记为constexpr ++ 11标准。有一个错误,其中std::ratio的时间点和其他组件未标记为constexpr但在N3469中已修复。

constexpr添加中受益的东西是std::initializer_list,这次没有得到任何东西(我不确定是否有任何建议允许它)。

  

是否存在向后兼容的原因而不这样做?

由于这是一个扩展,大多数东西都不会被破坏,因为旧代码仍然会按原样编译,现在什么都不是格式错误。但是,如果您没有预期,那么将constexpr添加到没有它的旧事物可能会导致一些令人惊讶的结果,例如示例provided here(感谢TemplateRex)

答案 1 :(得分:4)

上周(2013年9月23日至28日),标准委员会将constexpr添加到标准库中的更多例程中。

  • forward_as_tuple
  • 所有比较/逻辑/按位命名运算符的operator ()方法。 (lessgreaterplusminusbitwise_andlogical_ornot1 - 其余的)

@TemplateRex:我们在编译时越来越接近排序数组了。

然而,我们还解决了2013年LWG问题,指出标准库实施者无法自由地将标准中未定义的调用constexpr作为constexpr进行调用,因为这种差异实现之间可能会改变某些代码的行为。