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