C++14 标准库的哪些部分可能是,哪些部分将被制作成 constexpr

Which parts of the C++14 Standard Library could be and which parts will be made constexpr?

本文关键字:些部 constexpr 标准 C++14      更新时间:2023-10-16

随着新的宽松的C++14 constexpr规则,编译时编程变得更加富有表现力。我想知道标准库是否也会升级以利用。特别是,std::initializer_liststd::pairstd::tuplestd::complexstd::bitsetstd::array似乎是批发constexpr主要候选者。

问题

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

标准库的哪些部分现在将被标记为 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添加列表,您可以检查:N3469、N3470 和 N3471

还有哪些部分可以标记为 constexpr?

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

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

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

由于这是一个扩展,大多数东西都不会被破坏,因为旧代码仍将按原样编译,现在没有任何格式不正确的内容。但是,如果您没有预料到,将constexpr添加到没有它的旧事物可能会导致一些令人惊讶的结果,例如此处提供的示例(感谢 TemplateRex(

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

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

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

但是,我们还解决了 LWG 问题 2013,指出标准库实现者没有自由进行标准中未定义的调用,constexpr constexpr,因为实现之间的这种差异可能会改变某些代码的行为。