Это дефект в стандарте о зависимом разрешении имен для шаблона - PullRequest
1 голос
/ 19 июня 2020

О том, как найти зависимое имя для шаблона, Стандарт дает только небольшое предложение, такого как это, больше нет:

При разрешении зависимых имен учитываются имена из следующих источников:

  1. Объявления, которые видны в точке определения шаблона .
  2. Объявления из пространств имен, связанных с типами аргументов функции, как из контекста создания ([temp.point]), так и из контекста определения.

Рассмотрим приведенный ниже код

struct Test{
  using type = int;
};
// #1
template<typename T>
struct TMP{
  using type = typename T::type;
};
int main(){
  TMP<Test>::type v = 0;
}

Для этого кода имя type действительно является зависимым именем, потому что T является параметром шаблона, а вот это не вызов функции. Таким образом, единственный значимый пункт - это номер 1. В нем только сказано, что зависимое имя должно быть видно перед определением шаблона . Это означает, что в моем коде объявление должно быть видно в #1. Фактически, typename T::type является квалифицированным идентификатором, поэтому к нему применяются правила поиска квалифицированного имени, и поскольку T является параметром шаблона, действие поиска должно выполняться после заданного аргумента шаблона, а именно во время создания экземпляра специализация для такого шаблона. Но процитированная цитата об этом ничего не говорит. Итак, мне интересно, это дефект в стандарте? Если я пропущу что-то, что интерпретирует это в стандарте, укажите их в этом вопросе.

1 Ответ

0 голосов
/ 19 июня 2020

Для завершения комментариев language-lawyer в § "Неизвестные специализации" этой страницы

В определении шаблона некоторые имена выводятся из принадлежат к неизвестной специализации, в частности,

  • квалифицированное имя, если любое имя, которое появляется слева от ::, является зависимым типом, который не является членом текущего экземпляра
  • ...

В вашем struct TMP,

  • тип T действительно является зависимым типом
  • выражение typename T::type является квалифицированным именем и слева, если :: является зависимым типом
  • , это выражение становится неизвестной специализацией

Затем говорится:

Члены с неизвестной специализацией всегда зависимы, их ищут и связывают в точке создания как все зависимые имена

, что позволяет поиск TMP<Test>::type в точке создания .

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