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