Подтвердить что ты не робот

Есть ли способ передать строковый литерал в качестве ссылки в С++

Внутри С++ обычно передается по ссылке вместо указателя, если значение не может быть NULL.

Предположим, что у меня есть функция со следующей сигнатурой, которая часто используется со строковым литералом.

void setText( const char* text );

Мне было интересно, как я могу изменить функцию таким образом, чтобы она принимала ссылку (и имеет ли преимущество не принимать NULL)?

  • Если бы я изменил его на (const char& text), тогда это будет ссылка на один char. Из которого адрес может быть принят внутри функции... но чувствует себя не очень хорошо.

  • Другим вариантом будет (const std::string& text), который имеет тот недостаток, что он всегда вызывает конструктор и выполняет некоторое динамическое распределение памяти.

Любые другие общие способы или просто придерживайтесь std::string& или char*?

4b9b3361

Ответ 1

Честно говоря, я бы просто сохранил функцию const char* text и добавил функцию перегрузки const std::string& text, которая вызывает первый с setText(text.c_str())

Ответ 2

Здесь небольшая проблема в том, что С++ и reference-to-arrays не лучшая пара. Для справки см. С++ передайте массив по ссылке

Поскольку вы говорите о привязке ссылки к строке, а строка представляет собой массив символов, мы сталкиваемся с этой проблемой. В свете этого самое лучшее, что мы можем сделать, это привязать ref к const char *, который выглядит следующим образом:

void ref(const char* const& s);

Но это не делает то, что вы хотите; это связывает ссылку с указателем, и все это гарантирует, что сам указатель существует, а не указывает на допустимый строковый литерал. Эта же проблема присутствует в std::string & примеры: это гарантирует, что вы привязаны к объекту std::string, но эта строка может быть пустым, поэтому вы все еще не гарантировали себя строкой, которая имеет что-то полезное.

В конце концов, я повторю то, что говорит Зан. const char * - хорошо уважаемая идиома, передающая строковые литералы, а затем наличие второй перегрузки, которая привязывается к строкам, является приятным удобством.

(последнее примечание: std::string не "всегда" выделяет память. Реализации с небольшой оптимизацией строк будут пропускать его для строк длиной до 23 символов.)