Welche Ausdrücke ergeben einen Referenztyp, wenn auf sie ein Deklettyp angewendet wird?

Ich habe C ++ Primer gelesen und konnte nicht genau verstehen, wann ein Ausdruck einen Objekttyp und wann er einen Referenztyp für das Objekt liefert.

Ich zitiere aus dem Buch:

Wenn wir decltype auf einen Ausdruck anwenden, der keine Variable ist, erhalten wir den Typ,> den dieser Ausdruck ergibt.Im Allgemeinen gibt decltype einen Referenztyp für Ausdrücke zurück, die Objekte ergeben, die auf der linken Seite der Zuweisung stehen können.

Betrachtet man den Code unten:

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

Im obigen Code führt der Ausdruck "ref + 0" zu einer inhärenten Operation der Addition des Werts des Objekts, auf das sich ref bezieht, i und 0. Nach der ersten Regel ergibt der Ausdruck daher einen int-Typ. Wenn Sie sich jedoch an die zweite Regel halten, da der Ausdruck den Typ eines Objekts ergibt, das auf der linken Seite einer Zuweisung stehen kann (in diesem Fall int), sollte der Deklettyp dann nicht einen Verweis auf den Typ int (int &) ergeben?

Das Buch sagt auch, für den folgenden Code

decltype(*ptr) k;

k hat den Typ int & und nicht int, den Typ, zu dem der Ausdruck führt.

Es sagt auch, dass für einen Zuweisungsausdruck wie im Code unten

decltype(a = b) l;

lch hätte die Art der Referenz auf ein Objekt auf der linken Seite der Zuweisungsoperation.

Woher wissen wir, welche Ausdrücke den Objekttyp und welche den Verweis auf den Objekttyp ergeben?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage