Странность явной пометки зависимых имен как typename и template - PullRequest
0 голосов
/ 11 июля 2020

Взгляните на этот фрагмент кода:

template<typename T>
struct s {
    template<int Index>
    using type_alias = s<typename T::template identifier<Index>::type>;
};

Это компиляция, но только из-за явных typename и template 'маркеров' для зависимых имен в типе s::type_alias -alias.

Меня интересуют следующие две вещи:

  1. Почему мне нужно явно отмечать T как typename? В конце концов, это не зависимое имя, а именно typename, как указано в списке параметров шаблона s.
  2. Почему я могу только (необязательно) отметить type как template (т.е. s<typename T::template identifier<Index>::template type>), но не как typename? В конечном счете, это - это , используемое в качестве аргумента шаблона typename для s, поэтому действительно должно быть typename.

MSVC 19.25.28614 for x64 с /std:c++latest использовалось, если это актуально.


PS: Заголовок и вопрос очень специализированы в исходной версии, поэтому не стесняйтесь редактировать его, если найдете способ обобщить как-нибудь.

1 Ответ

1 голос
/ 11 июля 2020

В синтаксисе:

typename T::template identifier<Index>::type

ключевое слово typename не говорит, что T является типом - оно говорит, что все T::template identifier<Index>::type является типом. Когда он не вводит параметр шаблона, typename всегда предшествует qual-id , что-то, что содержит хотя бы один токен ::, например A::B::C, и говорит, что фамилия в этой цепочке имен и :: токены именуют тип.

С другой стороны, использование ключевого слова template для указания того, что имя элемента называет шаблон, всегда следует после :: или . или -> и непосредственно перед именем, которое является шаблоном.

Итак, в этом примере допустимой грамматикой является T::template identifier<Index>::template type, но это не имеет смысла вместе с предыдущим typename и фактом что s ожидает тип, а не шаблон в качестве аргумента шаблона.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...