web-dev-qa-db-fra.com

Comment déclarer une chaîne C constexpr?

Je pense que je comprends très bien comment utiliser le mot clé constexpr pour les types de variables simples, mais je suis confus en ce qui concerne les pointeurs sur les valeurs.

Je voudrais déclarer un littéral de chaîne C constexpr, qui se comportera comme

#define my_str "hello"

Cela signifie que le compilateur insère le littéral de chaîne C à chaque endroit où j'entre ce symbole, et je pourrai obtenir sa longueur au moment de la compilation avec sizeof.

Est-ce constexpr char * const my_str = "hello";

ou const char * constexpr my_str = "hello";

ou constexpr char my_str [] = "hello";

ou quelque chose de différent?

13
Youda008

Est-ce constexpr char * const my_str = "hello";

Non, car un littéral de chaîne n'est pas convertible en pointeur vers char. (Il était antérieur à C++ 11, mais même alors, la conversion était obsolète).

ou const char * constexpr my_str = "hello";

Non. constexpr ne peut pas y aller.

Ce serait bien formé:

constexpr const char * my_str = "hello";

mais cela ne suffit pas:

Pour que je puisse obtenir sa longueur au moment de la compilation avec sizeof, etc.


ou constexpr char my_str [] = "hello";

Ceci est bien formé, et vous pouvez en effet obtenir la longueur au moment de la compilation avec sizeof. Notez que cette taille est la taille du tableau, pas la longueur de la chaîne, c'est-à-dire que la taille inclut le terminateur nul.

18
eerorika

Dans C++ 17 , vous pouvez utiliser std::string_view et string_view_literals

using namespace std::string_view_literals;
constexpr std::string_view my_str = "hello, world"sv;

Alors,

my_str.size() est la constante de temps de compilation.

15
P0W