Поиск функции через шаблонный аргумент аргумента

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 для шаблонов классов учитываются шаблонные аргументы. Про шаблоны функций ничего не написано, значит их шаблонные аргументы не учитываются.

→ Ссылка