¿Qué expresiones producen un tipo de referencia cuando se les aplica decltype?

Estaba leyendo C ++ Primer y no podía entender cuando una expresión produce un tipo de objeto, y cuando produce un tipo de referencia para el objeto.

Cito del libro:

Cuando aplicamos decltype a una expresión que no es una variable, obtenemos el tipo que> esa expresión produce.En términos generales, decltype devuelve un tipo de referencia para expresiones que producen objetos que pueden estar en el lado izquierdo de la asignación.

Teniendo en cuenta el siguiente código:

int i = 3, *ptr = &i, &ref = i;
decltype(ref + 0) j;

En el código anterior, la expresión "ref + 0" da como resultado una operación inherente de adición de valor del objeto que ref se refiere a, i y 0. Por lo tanto, siguiendo la primera regla, la expresión produce un tipo int. Pero siguiendo la segunda regla, ya que la expresión produce el tipo de un objeto que puede estar en el lado izquierdo de una asignación (en este caso, int), ¿no debería el decltype producir un ref al tipo int (int &)?

El libro también dice, para el siguiente código.

decltype(*ptr) k;

k tiene el tipo int & y no int, el tipo en el que resulta la expresión.

También dice que para una expresión de asignación como en el código siguiente

decltype(a = b) l;

Tendría el tipo de referencia al objeto en el lado izquierdo de la operación de asignación.

¿Cómo sabríamos qué expresiones producen el tipo de objeto y cuáles dan la referencia al tipo de objeto?

Respuestas a la pregunta(2)

Su respuesta a la pregunta