Como el uso anterior de char * está en desuso, ¿no puede simplemente usar una cadena?
const char* func1() {return "string literal";}
string func2() {return "another string literal";}
Ambos funcionan bien, sin advertencias del compilador.
Sin embargo
char* func3() {return "yet another string literal";}
no se compilará en absoluto. Tampoco lo hará
char* func4() {return &"a ref to a string literal?";}
BS dice en "The C++ Programming Language" (Tercera Edición):.
"Una cadena literal se asigna de forma estática por lo que es seguro volver algún partir de una función
const char* error_message (int i)`
{
//...
return "range error";
}
"La memoria que contiene error en la distancia no va a desaparecer después de una llamada de error_messages().
De modo que cada literal de cadena en un programa se asigna en su propia pequeña porción de memoria que dura mientras dura el programa (es decir, está asignada estáticamente). Poner el const delante del char * le permite al compilador saber que no tiene la intención (y no puede) alterar el pequeño trozo de memoria del literal de cadena que podría ser peligroso, así que dejan que esta asignación se desplace a pesar de la conversión de cadena literal a char * es obsoleto.
Volviendo en cambio a una cadena, debe copiar el literal de cadena en un objeto de tipo cadena, memoria de la que es responsable la persona que llama.
De cualquier forma no hay pérdidas de memoria: cada literal de cadena obtiene su propia pieza de memoria que se limpia al terminar el programa; return to const char * devuelve un puntero a la pieza de memoria de un literal (sabiendo que no puede modificarlo); y volver a una cadena hace una copia en un objeto de cadena existente en el código de la persona que llama que limpia la persona que llama.
Aunque parece un poco desagradable en cuanto a la notación, supongo que dejaron el const char * para mantener la alternativa barata (sin copias).
Su requisito de que devuelva 'char *' en lugar de 'char const *' nos obliga a suponer que un literal de cadena simple no será suficiente y por lo tanto 'devolver" hello world ";' es una solución no válida. ¿Cuáles son sus requisitos sobre constness? –