Поскольку устаревшее использование char * устарело, не можете ли вы просто использовать строку?
const char* func1() {return "string literal";}
string func2() {return "another string literal";}
Оба работают нормально, без каких-либо предупреждений компилятора.
Однако
char* func3() {return "yet another string literal";}
не будут компилироваться. Не будет
char* func4() {return &"a ref to a string literal?";}
Страуструп говорит в «Язык программирования C++» (Третье издание):.
«Строковый литерал статически, так что это безопасно возвращать одно из функции
const char* error_message (int i)`
{
//...
return "range error";
}
Память Ошибка диапазона не исчезнет после вызова error_messages(). "
Таким образом, каждый строковый литерал в программе выделяется в своем собственном маленьком фрагменте памяти, который длится в течение всего времени программы (т. Е. Статически выделяется). Помещение const перед символом char * позволяет компилятору знать, что вы не намерены (и не можете) изменить маленький фрагмент памяти строкового литерала, который может быть опасным, поэтому они позволяют этому присваиванию скользить, несмотря на то, что преобразование из строкового литерала в char * не рекомендуется.
Возвращаясь вместо строки, необходимо скопировать строковый литерал в объект типа string, память, за которую отвечает вызывающий.
В любом случае нет утечек памяти: каждый строковый литерал получает свою собственную часть памяти, которая очищается от завершения программы; return to const char * возвращает указатель на кусок памяти литерала (зная, что вы не можете его изменить); и возврат к строке приводит к копированию в строковый объект, существующий в коде вызывающего абонента, который очищается вызывающим.
Хотя кажется немного уродливым нотации, я предполагаю, что они оставили const char *, чтобы сохранить дешевую альтернативу (без каких-либо копий).
Ваше требование, чтобы оно возвращало 'char *' вместо 'char const *', фактически заставляет нас предположить, что простой литерал строки не будет достаточным и, следовательно, «вернуть» мир привет »,' является недопустимым решением. Каковы ваши требования к константе? –