Ответ 1
AFAIK Конструктор initlializer_list
std::vector<>
не объявлен constexpr
.
Я могу создать 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};
AFAIK Конструктор initlializer_list
std::vector<>
не объявлен constexpr
.
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
std::vector
использует распределение динамической памяти. Оператор new
не может использоваться в методах constexpr
, поэтому std::vector
никогда не будет constexpr
, конструктор constexpr не может быть объявлен для него.
std::array
не использует динамическое распределение памяти, он выделяется в стеке. Он не имеет никаких проблем с правилами создания объектов constexpr и может быть constexpr.