Я хочу сделать следующее:
std::unique_ptr<char[]> buffer = new char[ /* ... */ ] { "/tmp/file-XXXXXX" };
Очевидно, что это не работает, потому что я не указал размер нового массива. Как правильно достичь своей цели, не считая символы в строковом литерале?
Использование std::array
также приветствуется.
Обновление № 1: даже если я укажу размер массива, он тоже не будет работать.
Обновление № 2: жизненно важно иметь неконстантная доступ к массиву как простой char*
указатель.
Вот решение, основанное на std::array
:
std::array<char, sizeof("/tmp/file-XXXXXX")> arr{ "/tmp/file-XXXXXX" };
Вы можете уменьшить шаблон, используя макрос:
#define DECLARE_LITERAL_ARRAY(name, str) std::array<char, sizeof(str)> name{ str }
DECLARE_LITERAL_ARRAY(arr, "/tmp/file-XXXXXX");
sizeof
вычисляется во время компиляции, поэтому во время выполнения не выполняется сканирование литеральной строки для определения ее длины. Результирующий массив завершается нулем, что вам, вероятно, все равно нужно.
Поскольку вы запросили динамический массив и не хотите считать длину, это исключает std::array<char,N>
, То, что вы просите, на самом деле просто std::string
— он динамический (при необходимости) и прекрасно инициализируется из char*
без учета длины. Внутри он хранит строку в плоском массиве, так что вы можете использовать ее как таковой через c_str()
вызов.
Я не понимаю, почему вы не используете std::string
; ты можешь сделать str.empty() ? NULL : &str[0]
чтобы получить неконстантный указатель, поэтому константа str.c_str()
не собирается создавать проблемы.
Тем не менее, обратите внимание, что это не заканчивается нулем.