В текущем стандарте C ++ (март 2019 г.) есть два абзаца (выделено мной):
[temp.res] стр.2 :
Предполагается, что имя, используемое в объявлении или определении шаблона и зависящее от параметра-шаблона, не называет тип , если только при соответствующем поиске имени не найдено имя типа или имя не определено ключевое слово typename. [...]
[temp.res] стр.9 :
При поиске объявления имени, используемого в определении шаблона, для независимых имен используются обычные правила поиска ([basic.lookup.unqual], [basic.lookup.argdep]). Поиск имен, зависящих от параметров шаблона, откладывается до тех пор, пока фактический аргумент шаблона не станет известен ([temp.dep]). [...]
Первый абзац подразумевает, что имя, зависящее от параметра шаблона, будет проверяться «соответствующим поиском имени».
Однако во втором абзаце говорится, что поиск имен, зависящих от параметров шаблона, откладывается до тех пор, пока аргумент шаблона не станет известен.
Пример, являющийся частью первого абзаца, включает ситуацию, подобную следующей:
template <typename T>
class A
{
void f()
{
T* p;
}
};
В методе f
, я полагаю, T
- это «имя, зависящее от параметров шаблона», поэтому его поиск следует отложить до тех пор, пока не станет известен T
, поэтому нет «применимого поиска по имени», имя должно Предполагается, что не называть тип.
Что означает первый процитированный абзац под «если применимый поиск имени не находит имя типа», если во втором процитированном абзаце кажется, что поиск не выполнен? Я что-то упустил?
Спасибо.