Ответ 1
Когда WORKS=0
, программа может быть выполнена для компиляции в Clang, присвоив вызов fFooBar
с помощью ::
. Стандарт требует, чтобы поиск имени вел себя по-разному, когда в вызове функции используется неквалифицированное имя.
[basic.lookup.argdep]/1
Когда постфиксное выражение в вызове функции (5.2.2) является неквалифицированным-id, другие пространства имен не считаются во время обычного неквалифицированного поиска (3.4.1), и в этих пространствах имен пространство имен (11.3), которые не отображаются в других местах, могут быть найдены.
Изучение (несколько сложных) правил для процесса, зависящего от аргумента, предполагает, что оно может быть реализовано корректно только таким образом, чтобы потребовалось создание специализированных шаблонов в типах аргументов для вызова.
[basic.lookup.argdep]/2
Для каждого типа аргумента T в вызове функции существует набор из нулевых или более связанных пространств имен и a набор нулевых или более связанных классов. Определены наборы пространств имен и классов полностью по типам аргументов функции [...]
- Если T - тип класса (включая объединения), его ассоциированные классы: сам класс; класс которого он является член, если таковой имеется; и его прямые и косвенные базовые классы.
Одна из интерпретаций этого заключается в том, что класс должен быть полным, если он используется в типе аргумента для вызова неквалифицированной функции. Альтернативная интерпретация заключается в том, что ADL должен вызывать только создание экземпляров завершенных шаблонов.
Любое поведение соответствует стандарту в соответствии с рабочим проектом N3337
[temp.inst]/6
Если процесс разрешения перегрузки может определить правильную функцию для вызова без создания экземпляра класса определение шаблона, неуказано, действительно ли это создание.
template <class T> struct S {
operator int();
};
void f(int);
void f(S<int>&);
void f(S<float>);
void g(S<int>& sr) {
f(sr); // instantiation of S<int> allowed but not required
// instantiation of S<float> allowed but not required
};
[temp.inst]/7
Если требуется неявное создание экземпляра специализации шаблона шаблона, и шаблон объявляется, но не определяется, программа плохо сформирована.