Постфиксное выражение со списком аргументов-шаблонов не подхватывается ADL

Я хочу понять, почему вызов шаблона f ниже не компилируется:

struct A
{
    template<class...>
    friend void f(A) { }
} x;

int main()
{
    f<>(x);
}

ADL требует, чтобы постфиксное выражение в вызове функции было неполным идентификатором. Является ли простой идентификатор шаблона (f<>) неполным идентификатором?


person 0x499602D2    schedule 18.01.2015    source источник
comment
отлично компилируется в g++ 4.9, но не в clang++   -  person vsoftco    schedule 18.01.2015
comment
Внешний интерфейс EDG говорит, что f не определено.   -  person Dietmar Kühl    schedule 18.01.2015
comment
Вы подали отчет об ошибке? Код по-прежнему компилируется на gcc6 HEAD, а не должен.   -  person vsoftco    schedule 05.06.2015
comment
@ 0x499602D2 Хм, 6 лет, а я все еще силен :)   -  person vsoftco    schedule 05.06.2015


Ответы (1)


Соответствующим пунктом является 7.3.1.2 [namespace.memdef], параграф 3:

Каждое имя, впервые объявленное в пространстве имен, является членом этого пространства имен. Если объявление друга в нелокальном классе сначала объявляет класс, функцию, шаблон класса или шаблон функции, друг является членом самого внутреннего окружающего пространства имен. Объявление друга само по себе не делает имя видимым для неквалифицированного поиска (3.4.1) или квалифицированного поиска (3.4.3). ...

То есть найти это имя можно только через ADL. Однако для применения аргументов шаблона имя нужно найти уже в соответствии с 14.2 [temp.names] пункт 2:

Чтобы имя-шаблона явно определялось аргументами шаблона, должно быть известно, что имя ссылается на шаблон.

person Dietmar Kühl    schedule 18.01.2015