Подтвердить что ты не робот

Невозможно создать constexpr std::vector

Я могу создать constexpr std:: array:

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

Он отлично работает. Но я не могу создать constexpr vector:

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

4b9b3361

Ответ 1

AFAIK Конструктор initlializer_list std::vector<> не объявлен constexpr.

Ответ 2

std::vector не является constexpr. Есть предложение сделать std::vector constexpr: https://github.com/ldionne/wg21/blob/master/generated/p1004r1.pdf

Целый разговор о предстоящих изменениях в С++ 20/23: https://youtu.be/CRDNPwXDVp0?t=3080

Так что проверьте снова с С++ 20.

[edit]: constexpr std::vector был одобрен для С++ 20! https://www.reddit.com/r/cpp/comments/au0c4x/201902_kona_iso_c_committee_trip_report_c20/

[edit 2019-10]: транк gcc (с флагом --std=c++2a) начал реализовывать constexpr new (предварительное условие для constexpr vector). Видеть: https://youtu.be/FRTmkDiW5MM?t=372

Ответ 3

std::vector использует распределение динамической памяти. Оператор new не может использоваться в методах constexpr, поэтому std::vector никогда не будет constexpr, конструктор constexpr не может быть объявлен для него. std::array не использует динамическое распределение памяти, он выделяется в стеке. Он не имеет никаких проблем с правилами создания объектов constexpr и может быть constexpr.