Как объявить строку 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()
- постоянная времени компиляции.