Das Thema wurde diskutiert vor , aber dies ist kein Duplikat.
Wenn jemand nach dem Unterschied zwischen decltype(a)
und fragt , lautet decltype((a))
die übliche Antwort: - a
ist eine Variable, (a)
ist ein Ausdruck. Ich finde diese Antwort unbefriedigend.
Erstens a
ist auch ein Ausdruck. Die Optionen für einen primären Ausdruck umfassen unter anderem:
- ( Ausdruck )
- ID-Ausdruck
Noch wichtiger ist, dass die Formulierung für decltype Klammern sehr, sehr explizit berücksichtigt :
For an expression e, the type denoted by decltype(e) is defined as follows:
(1.1) if e is an unparenthesized id-expression naming a structured binding, ...
(1.2) otherwise, if e is an unparenthesized id-expression naming a non-type template-parameter, ...
(1.3) otherwise, if e is an unparenthesized id-expression or an unparenthesized class member access, ...
(1.4) otherwise, ...
Die Frage bleibt also. Warum werden Klammern anders behandelt? Ist jemand mit technischen Unterlagen oder Ausschussdiskussionen dahinter vertraut? Die explizite Berücksichtigung von Klammern führt zu der Annahme, dass dies kein Versehen ist. Es muss also einen technischen Grund geben, den ich vermisse.
(a)
ist ein Ausdruck unda
ist ein Ausdruck und eine Variable".