27 votes

Le decltype (auto) pour une liaison structurée est-il censé être une référence?

Prenons un exemple:

#include <iostream>
#include <type_traits>
#include <tuple>

int main() {
    auto tup = std::make_tuple(1, 2);
    auto [ a, b ] = tup;
    decltype(auto) e = a;
    std::cout << std::boolalpha << std::is_reference_v<decltype(e)> << std::endl;
}

clang (sortie: false) et gcc (sortie: true) sont en désaccord dans ce cas simple. Ayant à l'esprit par exemple, ce Q&Que si l' e être une référence ou est-ce un bug de gcc? Ou peut-être que le code est mal formé?

18voto

Barry Points 45207

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X