Как объявить строку 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";

или еще что-то другое?

Ответ 1

Это constexpr char * const my_str = "hello";

Нет, потому что строковый литерал не конвертируется в указатель на char. (Раньше он был до С++ 11, но даже тогда преобразование было устаревшим).

или const char * constexpr my_str = "hello";

Нет. constexpr не может туда попасть.

Это будет хорошо сформировано:

constexpr const char * my_str = "hello";

но это не удовлетворяет:

Так что я смогу получить его длину во время компиляции с sizeof и т.д.


или constexpr char my_str [] = "hello";

Это хорошо сформировано, и вы можете получить длину во время компиляции с помощью sizeof. Обратите внимание, что этот размер является размером массива, а не длиной строки, то есть размер включает нулевой ограничитель.

Ответ 2

В С++ 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() - постоянная времени компиляции.