В стандарте c ++ [temp.point] написано:
Контекст создания экземпляра выражения, который зависит от аргументов шаблона, - это набор объявлений с внешней связью, объявленный до точки создания экземпляра специализации шаблона в той же единице перевода. .
Затем в [temp.dep.candidate]:
Для части поиска с использованием связанных пространств имен ([basic.lookup.argdep]) обнаруживаются только объявления функций, найденные либо в контексте определения шаблона, либо в контексте создания экземпляра шаблона .
Означает ли это, что следующий код должен завершиться ошибкой:
namespace A{
struct S{};
}
template<class T>
void g(T a){
f(a); //f will be found by argument dependent lookup
}
namespace A{
static void f(S); //but f doesn't have external linkage
}
void test(A::S i){
g(i);
}
//point of instantiation of g
//A::f(S) doesn't have external linkage
//=> so it's not in the instantiation context of template g ??
Этот код действительно компилируется, так что же означает этот стандартный абзац?
A::f
не должно быть найдено. Какие компиляторы пробовали? - person StoryTeller - Unslander Monica   schedule 22.07.2018