Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cannot create constexpr std::vector

Tags:

c++

c++11

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};

like image 580
Leo Avatar asked Oct 20 '15 16:10

Leo


People also ask

Can vector be constexpr?

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!

Can std :: function be constexpr?

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.

What is constexpr in C++11?

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.


Video Answer


1 Answers

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 )

like image 72
user643011 Avatar answered Oct 05 '22 17:10

user643011