2015-10-20 2 views
6

Я могу создать constexpr зЬй :: массива:Невозможно создать constexpr зОго :: вектор

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

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

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

+9

Формально это потому, что конструктор 'vector' не объявлен' constexpr'. Почему это не так объявлено? Поскольку конструктор 'vector' обычно должен выделять память в куче, что, конечно же, может быть сделано только во время выполнения. –

+0

@Igor Tandetnik Итак, нет способа создать вектор constexpr? – Leo

+3

Нет, нет. Зачем вам это нужно? Мне это мало смысла. Весь смысл «вектора» - его способность динамически изменять размер. Если вам это не нужно, просто используйте 'std :: array' или простой массив. –

ответ

9

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

9

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

Смежные вопросы