El tema se discutió antes , pero esto no es un duplicado.
Cuando alguien pregunta sobre la diferencia entre decltype(a)
y decltype((a))
, la respuesta habitual es: a
es una variable, (a)
es una expresión. Encuentro esta respuesta insatisfactoria.
Primero, a
es una expresión también. Las opciones para una expresión primaria incluyen, entre otras:
- ( expresión )
- expresión-id
Más importante aún, la redacción de decltype considera los paréntesis de manera muy, muy explícita :
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, ...
Entonces la pregunta permanece. ¿Por qué los paréntesis son tratados de manera diferente? ¿Alguien está familiarizado con los documentos técnicos o las discusiones del comité detrás de esto? La consideración explícita de paréntesis lleva a pensar que esto no es un descuido, por lo que debe haber una razón técnica que me falta.
(a)
es una expresión ya
es una expresión y una variable".