Тема обговорювалася раніше , але це не дублікат.
Коли хтось запитує про різницю між 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
це вираз і змінна ".