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

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

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

void setText( const char* text );

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

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

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

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

2 ответа

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

Здесь небольшая проблема в том, что C++ и ссылки на массивы - не лучшая пара. Для справки смотрите: C++ передает массив по ссылке

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

void ref(const char* const& s);

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

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

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

Другие вопросы по тегам