O assunto foi discutido antes , mas isso não é uma duplicata.
Quando alguém pergunta sobre a diferença entre decltype(a)
e decltype((a))
, a resposta usual é - a
é uma variável, (a)
é uma expressão. Acho esta resposta insatisfatória.
Primeiro, a
é uma expressão também. As opções para uma expressão primária incluem, entre outras -
- (expressão)
- expressão id
Mais importante, o fraseado para decltype considera parênteses muito, muito explicitamente :
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, ...
Então a questão permanece. Por que os parênteses são tratados de maneira diferente? Alguém está familiarizado com documentos técnicos ou discussões de comitês por trás disso? A consideração explícita entre parênteses leva a pensar que isso não é um descuido, então deve haver uma razão técnica que me falta.
(a)
é uma expressão ea
é uma expressão e uma variável".