41 votes

Pourquoi faut-il encore désambiguïser un type dépendant avec un nom de type dans le RHS d'une instruction using?

Je sais très bien pourquoi on a besoin d'utiliser typename pour les types de charge, car le compilateur ne peut pas être en mesure de lever l'ambiguïté entre un type et d'une déclaration de variable lorsqu'il voit quelque chose comme T::type, voir, par exemple, cette réponse pour une grande explication. TL;DR: dans une expression comme T::type * x;, le compilateur ne peut pas "savoir" si T::type est un type ou peut-être une variable déclarée dans certains spécialisation particulière pour T.

Cependant, quelque chose comme

using type = T::type;

il n'y a rien d'ambigu. OMI, T::type doit toujours être analysée comme un type, il fait partie de l'ERS d'une using déclaration. Toutefois, nous avons encore besoin d'utiliser l' typename ici (au moins selon la gcc et clang),

using type = typename T::type;

En direct sur Coliru, gcc En direct sur Coliru, clang

Visual C++ semble accepter le code sans typename, cependant je n'ai pas trop de foi dans le compilateur être entièrement conformes à la norme (en fait, il a beaucoup les extensions non standard, comme la liaison rvalues à la non-const références).

Question: Est-il une raison pourquoi ce n'est pas une exception à l' typename règle en C++11 et plus tard?

2voto

Davis Herring Points 7254

Il n'y a aucune raison. Comme ralismark dit, un document a été discuté de cette année (pour le C++20, pas 17 ans!). Il y a des inquiétudes, mais aussi des contrepoints:

  1. Il pourrait être considéré comme la langue la moins réguliers (comme codeshot dit), mais l'idée nouvelle est que disambiguating typename deviendra assez rare d'avoir près de cohérence dans l'autre sens. (Comme il a été dit, il y avait déjà un cas exceptionnel dans la forme de base de la classe des noms.)
  2. Il pourrait exclure certaines extensions possibles ( T. C. signalé), mais les extensions pourraient avoir leur propre homonymie plutôt que de surcharger le cas le plus courant.

Le papier a un soutien fort et les nouvelles règles vont probablement apparaître dans le projet de travail dans quelques mois.

0voto

Michaël Roy Points 4001

Le type d'argument de modèle T ne contient pas et ne peut implicitement contenir ses composants internes. ainsi, T :: type est fondamentalement un nouveau type lorsque le compilateur examine le modèle non instancié, d'où la nécessité de déclarer un nouveau nom de type 'T :: type'.

Malheureusement, je pense que cette question restera avec nous jusqu'à ce que la norme inclue des concepts à part entière.

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