О том, как найти зависимое имя для шаблона, Стандарт дает только небольшое предложение, такого как это, больше нет:
При разрешении зависимых имен учитываются имена из следующих источников:
- Объявления, которые видны в точке определения шаблона .
- Объявления из пространств имен, связанных с типами аргументов функции, как из контекста создания ([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
является параметром шаблона, действие поиска должно выполняться после заданного аргумента шаблона, а именно во время создания экземпляра специализация для такого шаблона. Но процитированная цитата об этом ничего не говорит. Итак, мне интересно, это дефект в стандарте? Если я пропущу что-то, что интерпретирует это в стандарте, укажите их в этом вопросе.