C++14 标准库的哪些部分可能是,哪些部分将被制作成 constexpr
Which parts of the C++14 Standard Library could be and which parts will be made constexpr?
随着新的宽松的C++14 constexpr规则,编译时编程变得更加富有表现力。我想知道标准库是否也会升级以利用。特别是,std::initializer_list
、std::pair
、std::tuple
、std::complex
、std::bitset
和std::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::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++11标准中标记为constexpr
。有一个错误,其中std::ratio
的时间点和其他组件没有标记为constexpr
,但它在 N3469 中得到了修复。
从constexpr
添加中受益的东西将是std::initializer_list
,这次没有得到任何(我不确定是否有任何建议允许它(。
是否有向后兼容性原因不这样做?
由于这是一个扩展,大多数东西都不会被破坏,因为旧代码仍将按原样编译,现在没有任何格式不正确的内容。但是,如果您没有预料到,将constexpr
添加到没有它的旧事物可能会导致一些令人惊讶的结果,例如此处提供的示例(感谢 TemplateRex(
上周(2013 年 9 月 23 日至 28 日(,标准委员会在标准库中的更多例程中添加了constexpr
。
- forward_as_tuple
- 所有比较/逻辑/按位命名运算符的
operator ()
方法。(less
、greater
、plus
、minus
、bitwise_and
、logical_or
、not1
等(
@TemplateRex:我们越来越接近在编译时对数组进行排序。
但是,我们还解决了 LWG 问题 2013,指出标准库实现者没有自由进行标准中未定义的调用,constexpr
constexpr
,因为实现之间的这种差异可能会改变某些代码的行为。
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 多成员Constexpr结构初始化
- 条件constexpr函数
- constexpr 函数中的非文字(通过 std::is_constant_evaluated)
- Visual C++ constexpr Hints
- 如何确认我的constexpr表达式实际上已经在编译时执行
- 为什么constexpr的性能比正常表达式差
- 是否可以使用if constexpr删除控制流语句
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 为什么std::isnan 不是 constexpr?
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 当一个值是非常量但用常量表达式初始化时使用constexpr
- 更多constexpr容器是否需要mark_immutable_if_consexpr
- C++从其他 constexpr 创建 lambda 不能按顺序执行 Constexpr
- constexpr上下文中std::initializer_list的验证
- constexpr构造函数需要常量成员函数时出现问题
- vs 2015 constexpr变量不恒定,但与2019相比还好吗
- C++constexpr实现差异
- 添加静态constexpr成员是否会更改结构/类的内存映射
- 我可以做些什么来消除或最小化这种将提供相同功能和行为的代码重复