L'argomento è stato discusso in precedenza , ma questo non è un duplicato.
Quando qualcuno chiede la differenza tra decltype(a)
e decltype((a))
, la solita risposta è - a
è una variabile, (a)
è un'espressione. Trovo questa risposta insoddisfacente.
Innanzitutto, a
è anche un'espressione. Le opzioni per un'espressione primaria includono, tra le altre cose:
- (espressione)
- id-espressione
Ancora più importante, il fraseggio per declinare considera le parentesi molto, molto esplicitamente :
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, ...
Quindi la domanda rimane. Perché le parentesi sono trattate in modo diverso? Qualcuno ha familiarità con documenti tecnici o discussioni di comitato dietro di esso? La considerazione esplicita delle parentesi porta a pensare che questa non sia una svista, quindi ci deve essere un motivo tecnico che mi manca.
(a)
è un'espressione,a
è un'espressione e una variabile".