Le sujet a été discuté auparavant , mais ce n'est pas un doublon.
Lorsque quelqu'un demande la différence entre decltype(a)
et decltype((a))
, la réponse habituelle est - a
est une variable, (a)
est une expression. Je trouve cette réponse insatisfaisante.
Tout d'abord, a
c'est aussi une expression. Les options pour une expression primaire incluent, entre autres -
- ( expression )
- id-expression
Plus important encore, le phrasé pour decltype considère les parenthèses très, très explicitement :
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, ...
La question demeure donc. Pourquoi les parenthèses sont - elles traitées différemment? Quelqu'un connaît-il les documents techniques ou les discussions en comité qui se cachent derrière? La considération explicite des parenthèses conduit à penser que ce n'est pas un oubli, donc il doit y avoir une raison technique qui me manque.
(a)
est une expression, eta
est une expression et une variable".