Тема обговорювалася раніше , але це не дублікат.
Коли хтось запитує про різницю між decltype(a)і decltype((a)), звичайна відповідь - aце змінна, (a)є виразом. Я вважаю цю відповідь незадовільною.
По-перше, aце також вираз. Параметри первинного вираження включають, серед іншого, -
- (вираз)
- id-вираз
Що ще важливіше, фразування для decltype розглядає круглі дужки дуже, дуже явно :
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, ...
Тож питання залишається. Чому дужки ставляться по-різному? Хтось знайомий з технічними документами чи дискусіями в комітетах? Чіткий розгляд дужок призводить до думки, що це не нагляд, тому я повинен мати технічну причину, яку я пропускаю.
(a)- це вираз, іaце вираз і змінна ".