I can create constexpr
std::array:
constexpr std::array<int,5> values {1,2,3,4,5};
It works fine. But I cannot create constexpr
vector:
constexpr std::vector<int> vec = {1,2,3,4,5};
It gives me an error:
the type 'const std::vector<int>' of constexpr variable 'vec' is not literal constexpr std::vector<int> vec = {1,2,3,4,5};
While it's best to rely on string_views and not create unnecessary string copies, the example above shows that you can even create pass vectors of strings inside a constexpr function!
Constexpr constructors are permitted for classes that aren't literal types. For example, the default constructor of std::unique_ptr is constexpr, allowing constant initialization.
The keyword constexpr was introduced in C++11 and improved in C++14. It means constant expression. Like const , it can be applied to variables: A compiler error is raised when any code attempts to modify the value. Unlike const , constexpr can also be applied to functions and class constructors.
There is a proposal to make std::vector
constexpr
: https://github.com/ldionne/wg21/blob/master/generated/p1004r1.pdf There is a whole talk about the upcoming C++20/23
changes: https://youtu.be/CRDNPwXDVp0?t=3080 So check again with C++20
!
[edit]: constexpr std::vector
has been approved for C++20
! https://www.reddit.com/r/cpp/comments/au0c4x/201902_kona_iso_c_committee_trip_report_c20/
[edit 2019-10]: gcc trunk (with --std=c++2a
flag) has started to implement constexpr new
(a prerequisite for constexpr vector
). See: https://youtu.be/FRTmkDiW5MM?t=372
[edit 2021-11]: both constexpr std::vector
and constexpr std::basic_string
are now implemented in gcc 12
( https://en.cppreference.com/w/cpp/compiler_support )
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With