Les identificateurs eux-mêmes sont des références. À partir de [dcl.struct.lier]/3:
Étant donné le type Ti désignés par std::tuple_element<i, E>::type
, chaque vi est une variable de type "référence à Ti" initialisé avec l'initialiseur, où la référence est une lvalue de référence si l'initialiseur est une lvalue et une référence rvalue autrement; le type indiqué est Tje.
C'est, a
et b
sont à la fois int&&
.
Mais la façon dont decltype(auto)
se comporte effectivement proviennent de [dcl.type.auto.déduire]:
Si l'espace réservé est l' decltype(auto)
type spécificateur, T
doit être l'espace réservé à lui seul. Le type de déduire pour l' T
est déterminé comme décrit dans [dcl.type.simple], comme s' e
avait été l'opérande de l' decltype
.
Cette formulation est vraiment bizarre, mais en fin de compte:
decltype(auto) e = a;
~~~~~~~~~~~~~~
moyens:
decltype( a ) e = a;
~~~~
et decltype(a)
- dire à partir [dcl.type.simple]/4.1:
si e
est un sans parenthèse id-expression de nommage structuré de liaison ([dcl.struct.lier]), decltype(e)
est le type référencé en tant que donnée dans la spécification de la structure de liaison de la déclaration;
Le type référencé d' a
est int
, alors e
doit être un int
. Ce qui signifie qu'il n'est pas une référence, et clang est correct. Déposé 81176.