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?