Utilisation de C ++ 11, Ubuntu 14.04, la chaîne d'outils par défaut de GCC .
Ce code échoue:
constexpr std::string constString = "constString";
erreur: le type 'const string {aka const std :: basic_string}' de la variable constexpr 'constString' n'est pas littéral ... parce que ... 'std :: basic_string' a un destructeur non trivial
Est-il possible d'utiliser std::string
dans un constexpr
? (apparemment pas ...) Si oui, comment? Y at - il une autre façon d'utiliser une chaîne de caractères dans un constexpr
?
std::string
n'est pas un type littéralstd::string
être constexpr? il existe plusieurs implémentations de chaînes au moment de la compilation sur SO. quel est l'intérêt de demander si vous pouvez créer un type non littéral constexpr si vous comprenez le message d'erreur et savez que seuls les types littéraux peuvent être créés constexpr? De plus, il y a plusieurs raisons pour lesquelles on peut vouloir avoir une instance constexpr, donc je vous suggère de clarifier votre questionconstexpr
des implémentations de chaînes.std::string
n'en fait pas partie.Réponses:
Non, et votre compilateur vous a déjà donné une explication complète.
Mais vous pouvez faire ceci:
Au moment de l'exécution, cela peut être utilisé pour construire un
std::string
fichier.la source
constexpr auto constString = "constString";
? Pas besoin d'utiliser cette vilaine syntaxe de tableau ;-)char[]
est plus verbeux / clair queauto
lorsque j'essaie de mettre l'accent sur le type de données à utiliser.auto
;-)constexpr auto s = "c"sv;
raison de l'introduction destring_view
À partir de C ++ 20 , oui.
À partir de C ++ 17 , vous pouvez utiliser
string_view
:A
string_view
est unstring
objet semblable à celui qui agit comme une référence immuable et non propriétaire à toute séquence d'char
objets.la source
const std::string&
un nouveau std :: string doit être construit. C'est généralement le contraire de ce que l'on avait en tête lors de la création d'une constante. Par conséquent, j'ai tendance à dire que ce n'est pas une bonne idée. Au moins, vous devez être prudent.string_view
n'est pas implicitement convertible enstring
, il y a donc peu de risque de construire accidentellement un àstring
partir d'un fichierstring_view
. Inversement,char const*
est implicitement convertible enstring
, donc l'utilisationstring_view
est en fait plus sûre dans ce sens.string_view
n'est pas implicitement convertible enstring
. OMI, le problème que j'ai soulevé est toujours valable mais ne s'applique passtring_view
spécifiquement. En fait, comme vous l'avez mentionné, c'est encore plus sûr à cet égard.string_view
c'est, au lieu d'un simple lien.C ++ 20 ajoutera des
constexpr
chaînes et des vecteursLa proposition suivante a apparemment été acceptée : http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0980r0.pdf et elle ajoute des constructeurs tels que:
en plus des versions constexpr de toutes / la plupart des méthodes.
Il n'y a pas de support à partir de GCC 9.1.0, la compilation suivante échoue:
avec:
avec erreur:
std::vector
discuté à: Impossible de créer constexpr std :: vectorTesté dans Ubuntu 19.04.
la source
Puisque le problème est le destructeur non trivial, donc si le destructeur est supprimé du
std::string
, il est possible de définir uneconstexpr
instance de ce type. Comme çala source
string_view
est, à l' exception questring_view
vous donne la plupart des fonctionnalités que vous savez destd::string