Ne peut pas créer constexpr std::vector
Je peux créer constexpr
std::array:
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};
Officiellement, c'est parce que
Tandetnik donc, il n'y a pas moyen de créer constexpr vecteur?
Non, il n'est pas. Pourquoi voudriez-vous? Il fait peu de sens pour moi. Le point de l'ensemble de
Tandetnik. En fait, je suis en utilisant
Il y a des cas d'utilisation, par exemple si vous avez un tableau global de la paire<enum, vector> où le vecteur peut être composé d'un nombre limité (mais variable) des nombres connus au moment de la compilation.
vector
constructeur n'est pas déclaré constexpr
. Pourquoi n'est-il pas déclarée? Parce que vector
constructeur a généralement besoin d'allouer de la mémoire sur le tas, ce qui, évidemment, ne peut être effectué au moment de l'exécution.Tandetnik donc, il n'y a pas moyen de créer constexpr vecteur?
Non, il n'est pas. Pourquoi voudriez-vous? Il fait peu de sens pour moi. Le point de l'ensemble de
vector
est sa capacité à redimensionner dynamiquement. Si vous n'en avez pas besoin, il suffit d'utiliser std::array
ou simple tableau.Tandetnik. En fait, je suis en utilisant
Qt
et il n'y a rien comme std::array
container, donc j'ai essayé d'utiliser QVector
et QList
et il ne fonctionne pas. Je ne veux pas mélanger Qt
et stl
conteneurs. Donc, je suppose que maintenant jeIl y a des cas d'utilisation, par exemple si vous avez un tableau global de la paire<enum, vector> où le vecteur peut être composé d'un nombre limité (mais variable) des nombres connus au moment de la compilation.
OriginalL'auteur Leo | 2015-10-20
Vous devez vous connecter pour publier un commentaire.
Autant que je sache, Le
initlializer_list
constructeur destd::vector<>
n'est pas déclaréconstexpr
.OriginalL'auteur cdonat
std::vector
utilise une allocation dynamique de la mémoire. Opérateurnew
ne peut pas être utilisé dansconstexpr
méthodes, ainsistd::vector
ne sera jamaisconstexpr
, constexpr constructeur ne peut pas être déclarée.std::array
ne pas utiliser l'allocation dynamique de la mémoire, il est alloué dans la pile. Il n'a aucun problème avec les règles de création constexpr objets et peut être constexpr.OriginalL'auteur Роман Коптев
std::vector est pas constexpr. Il y a une proposition à faire std::vector constexpr: https://github.com/ldionne/wg21/blob/master/generated/p1004r1.pdf
Il existe un ensemble de parler de la prochaine C++20/23 changements: https://youtu.be/CRDNPwXDVp0?t=3080
Afin de vérifier à nouveau avec C++20.
OriginalL'auteur user643011