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?