17 Templates [temp]

17.6 Name resolution [temp.res]

17.6.4 Dependent name resolution [temp.dep.res]

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

  • Объявления, которые видны в момент определения шаблона.

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

17.6.4.1 Point of instantiation [temp.point]

Для специализации шаблона функции, специализации шаблона функции-члена или специализации для функции-члена или статического члена данных шаблона класса, если специализация создается неявно, поскольку на нее имеется ссылка из другой специализации шаблона и контекста, из которого она указанная ссылка зависит от параметра шаблона, точка создания экземпляра специализации - это точка создания экземпляра включающей специализации. В противном случае точка создания такой специализации следует сразу за объявлением или определением области пространства имен, которое ссылается на специализацию.

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

Для noexcept-specifierспециализации шаблона функции или специализации функции-члена в шаблоне класса, если noexcept-specifierнеявно создается экземпляр, потому что он необходим другой специализации шаблона, и контекст, который требует этого, зависит от параметра шаблона, точкой создания экземпляра noexcept-specifierявляется точка реализации требуемой специализации. В противном случае точка создания такого объекта noexcept-specifierсразу следует за объявлением или определением области пространства имен, для которых требуется noexcept-specifier.

Для специализации шаблона класса, специализации шаблона члена класса или специализации для члена класса шаблона класса, если специализация создается неявно, потому что на нее ссылаются из другой специализации шаблона, если контекст, из которого делается ссылка на специализацию, зависит в параметре шаблона, и если специализация не создается до создания экземпляра включающего шаблона, точка создания экземпляра находится непосредственно перед точкой создания экземпляра включающего шаблона. В противном случае точка создания такой специализации непосредственно предшествует объявлению или определению области пространства имен, которое ссылается на специализацию.

Если виртуальная функция создается неявно, ее точка создания экземпляра следует сразу же за точкой создания экземпляра ее специализации шаблона включающего класса.

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

Контекст создания выражения, который зависит от аргументов шаблона, представляет собой набор объявлений с внешней связью, объявленных до момента создания экземпляра специализации шаблона в той же единице преобразования.

Специализация для шаблона функции, шаблона функции-члена или функции-члена или статического члена данных шаблона класса может иметь несколько точек создания экземпляров в единице перевода, и в дополнение к точкам создания экземпляров, описанным выше, для любых таких специализации, которая имеет точку создания в пределах единицы перевода, конец единицы трансляции также считается точкой создания экземпляра. Специализация для шаблона класса имеет не более одной точки создания экземпляра в единице перевода. Специализация для любого шаблона может иметь точки реализации в нескольких единицах перевода. Если две разные точки создания экземпляра придают специализации шаблона разные значения в зависимости от one-definition rule, программа имеет неправильный формат и диагностика не требуется.

17.6.4.2 Candidate functions [temp.dep.candidate]

Для вызова функции, где postfix-expression- зависимое имя, функции-кандидаты находятся с использованием обычных правил поиска ([basic.lookup.unqual], [basic.lookup.argdep]), за исключением того, что:

  • Для части использования поиска unqualified name lookupнайдены только объявления функций из контекста определения шаблона.

  • Для части поиска с использованием связанных пространств имен ([basic.lookup.argdep]) обнаруживаются только объявления функций, найденные либо в контексте определения шаблона, либо в контексте создания экземпляра шаблона.

Если вызов был бы неправильно сформирован или нашел бы лучшее совпадение, если бы при поиске в связанных пространствах имен учитывались все объявления функций с внешней связью, введенные в этих пространствах имен во всех единицах перевода, а не только с учетом этих объявлений, найденных в определении шаблона и шаблоне контекстов создания экземпляров, тогда программа имеет неопределенное поведение.