web-dev-qa-db-ja.com

constexpr C文字列を宣言するには?

単純な変数型にキーワードconstexprを使用する方法は十分理解できていると思いますが、値へのポインタに関しては混乱しています。

Constexpr C文字列リテラルを宣言したいと思います。

#define my_str "hello"

つまり、コンパイラはこの記号を入力するすべての場所にC文字列リテラルを挿入し、コンパイル時にsizeofを使用してその長さを取得できます。

それは...ですか constexpr char * const my_str = "hello";

またはconst char * constexpr my_str = "hello";

またはconstexpr char my_str [] = "hello";

またはまだ何か違う?

13
Youda008

それは...ですか constexpr char * const my_str = "hello";

いいえ、文字列リテラルはcharへのポインターに変換できないためです。 (以前はC++ 11より前でしたが、それでも変換は非推奨になりました)。

またはconst char * constexpr my_str = "hello";

いいえ。constexprはそこに行くことができません。

これは整形式です:

constexpr const char * my_str = "hello";

しかし、これは飽和しません:

そのため、sizeofなどを使用してコンパイル時に長さを取得できます。


またはconstexpr char my_str [] = "hello";

これは整形式であり、コンパイル時にsizeofで実際の長さを取得できます。このサイズは配列のサイズであり、文字列の長さではないことに注意してください。つまり、サイズにはヌルターミネータが含まれます。

18
eerorika

C++ 17 では、 _std::string_view_ および _string_view_literals_ を使用できます

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

次に、

my_str.size()はコンパイル時定数です。

15
P0W