2015-10-20 16 views
6

posso creare constexpr std :: array:Impossibile creare std :: vector constexpr

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

Funziona benissimo. Ma non posso creare constexpr vettore:

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

Mi dà un errore:

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

+9

Formalmente, questo è dovuto al fatto che il costruttore 'vector' non è dichiarato' constexpr'. Perché non è così dichiarato? Poiché il costruttore 'vector' in genere ha bisogno di allocare memoria sull'heap, che ovviamente può essere fatto solo in fase di esecuzione. –

+0

@Igor Tandetnik quindi, non c'è modo di creare il vettore di constexpr? – Leo

+3

No, non c'è. Perché vorresti? Ha poco senso per me. L'intero punto di 'vector' è la sua capacità di ridimensionare dinamicamente. Se non ti serve, usa semplicemente 'std :: array' o plain array. –

risposta

9

per quanto ne so il initlializer_list costruttore std::vector<> non è dichiarato constexpr.

9

std::vector utilizza un'allocazione di memoria dinamica. L'operatore new non può essere utilizzato nei metodi constexpr, quindi std::vector non sarà mai constexpr, il costruttore di constexpr non può essere dichiarato per esso. std::array non utilizza l'allocazione dinamica della memoria, è allocata nello stack. Non ha alcun problema con le regole di creazione degli oggetti constexpr e può essere constexpr.