不能创建constexpr std::vector

Cannot create constexpr std::vector

本文关键字:vector std constexpr 创建 不能      更新时间:2023-10-16

我可以创建constexpr std::array:

constexpr std::array<int,5> values {1,2,3,4,5};

很好。但是我不能创建constexpr矢量:

constexpr std::vector<int> vec = {1,2,3,4,5};

显示错误:

the type 'const std::vector<int>' of constexpr variable 'vec' is not literal constexpr std::vector<int> vec = {1,2,3,4,5};

有一个建议,使std::vector constexpr: https://github.com/ldionne/wg21/blob/master/generated/p1004r1.pdf有一个关于即将到来的C++20/23变化的完整讨论:https://youtu.be/CRDNPwXDVp0?t=3080所以再次检查C++20 !

[edit]: constexpr std::vector已获批C++20 !https://www.reddit.com/r/cpp/comments/au0c4x/201902_kona_iso_c_committee_trip_report_c20/

[edit 2019-10]: gcc trunk(带--std=c++2a标志)已经开始实现constexpr new (constexpr vector的先决条件)。参见:https://youtu.be/FRTmkDiW5MM?t=372

[edit 2021-11]: constexpr std::vectorconstexpr std::basic_string现在在gcc 12中实现 (https://en.cppreference.com/w/cpp/compiler_support)

对于至少在c++ 2a之前的c++版本:

std::vector使用动态内存分配。操作符new不能在constexpr方法中使用,因此std::vector永远不会是constexpr,不能为它声明constexpr构造函数。std::array不使用动态内存分配,它是在堆栈中分配的。它与创建constexpr对象的规则没有任何问题,并且可以是constexpr。

AFAIK std::vector<>initlializer_list构造函数没有声明为constexpr

相关文章: