¿En qué enunciado exacto exhibe este programa un comportamiento indefinido según el estándar C ++?

(Soy consciente del hecho de que la dirección / referencia de retorno a una variable local a la función debe evitarse y un programa nunca debe hacer esto).

¿Devuelve una referencia a una variable local / resultado de referencia en Comportamiento indefinido? ¿O el comportamiento indefinido solo ocurre más tarde, cuando se usa la referencia devuelta (o "desreferenciada")

es decir. en qué afirmación exacta #1 o#2 o#3) ¿el ejemplo de código a continuación invoca Comportamiento indefinido? (He escrito mi teoría junto a cada una)

#include <iostream>

struct A
{ 
   int m_i;
   A():m_i(10)
   {

   } 
};  
A& foo() 
{     
    A a;
    a.m_i = 20;     
    return a; 
} 

int main()
{
   foo();                // #1 - Not UB; return value was never used
   A const &ref = foo(); // #2 - Not UB; return value still not yet used
   std::cout<<ref.m_i;   // #3 - UB: returned value is used
}

Estoy interesado en saber qué especifica el estándar C ++ a este respecto.

Me gustaría una cita del estándar C ++ que básicamente me dirá qué enunciado exacto hace que este código esté mal formado.

Discusiones sobre cómo las implementaciones específicas manejan esto son bienvenidas, pero como dije, una respuesta ideal citaría una referencia del Estándar C ++ que aclara esto más allá de toda duda.

Respuestas a la pregunta(6)

Su respuesta a la pregunta