¿Por qué devolver una referencia a un literal de cadena es una referencia a un temporal?
Un literal de cadena de cadena normal tiene la siguiente definición:
Los literales de cadena ordinarios y los literales de cadena UTF-8 también se denominan literales de cadena estrecha. Un literal de cadena estrecha tiene el tipo "matriz de n const char", donde n es el tamaño de la cadena como se define a continuación y tiene una duración de almacenamiento estático (3.7).
Supongo que porque tiene una duración de almacenamiento estático y que generalmente se colocan en ROM, realmente no es un gran problema si hay una referencia pendiente. El siguiente código emite una advertencia.
const char* const & foo()
{
return "Hello";
}
// warning: returning reference to temporary [-Wreturn-local-addr]
Pero esto está bien, incluso sin la palabra clave estática
const char* const & foo()
{
const char* const & s = "Hello";
return s;
}
Entonces, ¿cuál es la diferencia entre los dos?