32

使用新的宽松 C++14 constexpr 规则,编译时编程变得更具表现力。我想知道标准库是否也会升级以利用。特别是 , , std::initializer_list,和似乎是被标记为批发的主要候选者。std::pairstd::tuplestd::complexstd::bitsetstd::arrayconstexpr

问题

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

2 回答 2

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[]sizeforstd::bitset和其他容器。
  • 所有std::complex的运算符比较

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

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

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

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

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

是否有向后兼容的理由不这样做?

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

于 2013-08-05T07:16:19.750 回答
4

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

  • forward_as_tuple
  • 所有比较/逻辑/按位命名运算符的operator ()方法。( less, greater, plus, minus, bitwise_and, logical_or, not1- 和其他)

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

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

于 2013-10-01T19:18:33.090 回答