Поиск функции через шаблонный аргумент аргумента
namespace A {
struct A {};
void call_foo(void (*f)()) {
f();
}
}
template<class T>
void f();
int main() {
call_foo(f<A::A>);
}
Является ли этот код валидным и почему? Компиляторы имеют разногласия на этот счёт (gcc и msvc компилируют его, в то время как clang - нет).
error: use of undeclared identifier 'call_foo'; did you mean 'A::call_foo'?
Ответы (1 шт):
Автор решения: HolyBlackCat
→ Ссылка
Кажется что Clang прав, код не должен компилироваться.
Открываем [basic.lookup.argdep]/3. Пишут, что при ADL для шаблонов классов учитываются шаблонные аргументы. Про шаблоны функций ничего не написано, значит их шаблонные аргументы не учитываются.