在C++20中,为什么将std::vector::push_back声明为constexpr?

6
根据cppref,在C++20中,std::vector::push_back的声明如下:
constexpr void push_back(const T& value);

我无法想象出一个场景,需要将push_back定义为constexpr
背后的原理是什么?

8
可能与将constexpr std::vector作为整体创建有关。请查看此讨论串 - rawrex
如果resize不是constexpr,会有什么不便之处吗? - xmllmx
1
你无法在常量上下文中使用resize。 - eerorika
1
在常量上下文中可以使用resize甚至push_back吗?@eerorika - xmllmx
2
@xmllmx 在C++20中,是的:https://godbolt.org/z/KKb8dPo44(目前只有MSVC实现了constexpr向量)。 - eerorika
1
可变函数已经被改为“constexpr”以允许在constexpr函数中使用它们。C ++20现在允许在constexpr函数中使用“std :: vector”。 - Jarod42
2个回答

4
有什么理由支持这个想法吗?
这是该提案的摘要,没有单独的理由部分:
P1004R2 让 std::vector 成为 constexpr std::vector 目前不符合 constexpr 的要求。随着 [P0784R1] 及相关文件中对 constexpr 要求的放宽,我们现在可以将 std::vector 设为 constexpr,以支持 constexpr 反射工作(以及其他明显的用例)

3

通常情况下,所有确定性操作(没有rand())都应该是constexpr,因为这样做有什么不好呢?您可以在运行时和编译时计算中使用相同的代码,这非常好,因为可以减少重复部分,并且您的constexpr代码更具习惯用法。在constexpr用例中,内存分配和push_back函数在编译器虚拟机中被调用,该虚拟机模拟了您的运行时机器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接