単純な変数型にキーワード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";
またはまだ何か違う?
それは...ですか
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
で実際の長さを取得できます。このサイズは配列のサイズであり、文字列の長さではないことに注意してください。つまり、サイズにはヌルターミネータが含まれます。
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()
はコンパイル時定数です。