2015-10-20 1 views
6

Je peux créer constexpr std :: tableau:Impossible de créer constexpr std :: vector

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

Il fonctionne très bien. Mais je ne peux pas créer constexpr vecteur:

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

Il me donne une erreur:

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

+9

Formellement, c'est parce que le constructeur 'vector' n'est pas déclaré' constexpr'. Pourquoi n'est-il pas ainsi déclaré? Parce que le constructeur 'vector' doit généralement allouer de la mémoire sur le tas, ce qui bien sûr ne peut être fait que lors de l'exécution. –

+0

@Igor Tandetnik donc, il n'y a aucun moyen de créer un vecteur constexpr? – Leo

+3

Non, il n'y en a pas. Pourquoi voudriez-vous? Cela n'a aucun sens pour moi. Le point entier de 'vector' est sa capacité à redimensionner dynamiquement. Si vous n'en avez pas besoin, utilisez simplement std :: array ou plain array. –

Répondre

9

Le constructeur AFAIK initlializer_list de std::vector<> n'est pas déclarée constexpr.

9

std::vector utilise une allocation de mémoire dynamique. L'opérateur new ne peut pas être utilisé dans les méthodes constexpr, donc std::vector ne sera jamais constexpr, le constructeur constexpr ne peut pas être déclaré pour cela. std::array n'utilise pas l'allocation de mémoire dynamique, il est alloué en pile. Il n'a aucun problème avec les règles de création des objets constexpr et peut être constexpr.