2015-10-20 40 views
6

mogę utworzyć constexpr std :: tablicy:Nie można utworzyć std :: vector constexpr

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

to działa dobrze. Ale nie mogę tworzyć constexpr Vector:

constexpr std::vector<int> vec = {1,2,3,4,5}; 

Daje mi błąd:

the type 'const std::vector<int>' of constexpr variable 'vec' is not literal constexpr std::vector<int> vec = {1,2,3,4,5};

+9

Formalnie jest tak dlatego, że konstruktor 'wektor' nie jest deklarowany' constexpr'. Dlaczego tak się nie deklaruje? Ponieważ konstruktor 'vector' zwykle musi alokować pamięć na stercie, co oczywiście może być wykonane tylko w czasie wykonywania. –

+0

@Igor Tandetnik, więc nie ma sposobu na stworzenie wektora constexpr? – Leo

+3

Nie, nie ma. Dlaczego chcesz? Nie ma dla mnie większego sensu. Cały punkt "wektora" to jego zdolność do dynamicznej zmiany rozmiaru. Jeśli tego nie potrzebujesz, po prostu użyj 'std :: array' lub zwykłej tablicy. –

Odpowiedz

9

AFAIK initlializer_list konstruktor std::vector<> nie jest zadeklarowany constexpr.

9

std::vector wykorzystuje dynamiczny przydział pamięci. Operator new nie może być używany w metodach constexpr, więc std::vector nigdy nie będzie constexpr, konstruktor constexpr nie może być dla niego deklarowany. std::array nie używa dynamicznego przydzielania pamięci, jest przydzielany w stosie. Nie ma żadnego problemu z regułami tworzenia obiektów constexpr i może być constexpr.

Powiązane problemy