Есть ли способ передать строковый литерал в качестве ссылки в 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 символов.)