¿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?

Respuestas a la pregunta(3)

Su respuesta a la pregunta