Temat był wcześniej omawiany , ale to nie jest duplikat.
Kiedy ktoś pyta o różnicę między decltype(a)
i decltype((a))
, jak zwykle odpowiedź brzmi - a
jest to zmienna, (a)
jest wyrazem. Uważam tę odpowiedź za niezadowalającą.
Po pierwsze, a
jest to także wyrażenie. Opcje wyrażenia podstawowego obejmują między innymi:
- ( wyrażenie )
- wyrażenie id
Co ważniejsze, frazowanie dla dekltype uwzględnia nawiasy bardzo, bardzo wyraźnie :
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, ...
Pozostaje więc pytanie. Dlaczego nawiasy są traktowane inaczej? Czy ktoś jest zaznajomiony z dokumentami technicznymi lub dyskusjami komitetów? Bezpośrednie rozważenie nawiasów prowadzi do przekonania, że nie jest to niedopatrzenie, więc musi istnieć techniczny powód, dla którego tęsknię.
(a)
jest wyrażeniem ia
jest wyrażeniem i zmienną”.