Quais expressões geram um tipo de referência quando o decltype é aplicado a elas?

Eu estava lendo C ++ Primer e não conseguia entender quando uma expressão produz um tipo de objeto e quando ele produz um tipo de referência para o objeto.

Cito do livro:

Quando aplicamos decltype a uma expressão que não é uma variável, obtemos o tipo que essa expressão produz.De um modo geral, decltype retorna um tipo de referência para expressões que geram objetos que podem ficar do lado esquerdo da atribuição.

Considerando o código abaixo:

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

No código acima, a expressão "ref + 0" resulta em uma operação inerente de adição de valor do objeto que ref refere-se a, i e 0. Assim, indo pela primeira regra, a expressão produz um tipo int. Mas indo pela segunda regra, como a expressão produz o tipo de um objeto que pode estar no lado esquerdo de uma atribuição (neste caso, int), não deveria o decltype produzir uma ref para int (int &) type?

O livro também diz, para o seguinte código

decltype(*ptr) k;

k tem tipo int & e não int, o tipo que a expressão resulta.

Também diz que para uma expressão de atribuição como no código abaixo

decltype(a = b) l;

Eu teria o tipo de referência para o objeto no lado esquerdo da operação de atribuição.

Como saberíamos quais expressões produzem o tipo de objeto e quais produzem a referência ao tipo de objeto?

questionAnswers(2)

yourAnswerToTheQuestion