60

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

6
  • 31
    Formally, that's because vector constructor is not declared constexpr. Why is it not so declared? Because vector constructor generally needs to allocate memory on the heap, which of course can only be done at run time. Commented Oct 20, 2015 at 16:36
  • @Igor Tandetnik so, there are no way to create constexpr vector? Commented Oct 20, 2015 at 16:42
  • 6
    No there is not. Why would you want to? It makes little sense to me. The whole point of vector is its ability to resize dynamically. If you don't need that, just use std::array or plain array. Commented Oct 20, 2015 at 16:46
  • 1
    @Igor Tandetnik. Actually, I am using Qt and there are nothing like std::array container, so I tried to use QVector and QList and it does not work. I don't want to mix Qt and stl containers. So, I guess now I have to Commented Oct 20, 2015 at 16:57
  • 3
    There are use cases, for example if you have a global array of pair<enum, vector> where vector can consist of a limited (but variable) numbers known at compile time. Commented Oct 8, 2018 at 10:00

3 Answers 3

93

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 )

Sign up to request clarification or add additional context in comments.

6 Comments

It has gone into C++20, together with std::string: stackoverflow.com/a/57284740/895245
both constexpr std::vector and constexpr std::basic_string are implemented in GCC 12 (en.cppreference.com/w/cpp/compiler_support)
Thanks @DesmondGold. I added this to the original answer. Much appreciated!
But constexpr vector doesn't mean that the OP's code has become valid, it is still rejected.
OP's code remains invalid because the constexpr std::vector is in use at runtime. No problem otherwise if vec is declared in a constexpr function. (Or, use constexpr std::array.)
|
37

For c++ version at least prior C++2a:

std::vector uses a dynamic memory allocation. Operator new can't be used in constexpr methods, thus std::vector will never be constexpr, constexpr constructor can't be declared for it. std::array doesn't use dynamic memory allocation, it is allocated in stack. It has no any problem with rules of creation constexpr objects and can be constexpr.

Comments

25

AFAIK The initlializer_list constructor of std::vector<> is not declared constexpr.

3 Comments

Actually, it is declared constexpr: c++20 draft: wg21.link/std20#lstlisting.22.-2632 and still in current draft sources: github.com/cplusplus/draft/blob/… it seems, it's just not yet implemented...
It seems, the only compiler, that currently supports it is Visual Studio: en.cppreference.com/w/cpp/…
4 years later (regarding the comments) ... still not supported in GCC gcc.godbolt.org/z/oxac4M99Y

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.