В этом описании на cppreference.com говорится, что
Поиск зависимого имени, используемого в шаблоне, откладывается до тех пор, пока не станут известны аргументы шаблона, когда [...] ADL проверяет объявления функций с внешней связью, которые видны либо из контекст определения шаблона или контекст создания шаблона.
В противоположность этому следующий фрагмент кода отлично компилируется с помощью трех компиляторов (MSVC, clang, gcc):
template <class T>
void CallFoo ()
{
Foo (T ());
}
class Apple {};
int main ()
{
CallFoo<Apple> ();
}
static void Foo (Apple)
{
}
Foo
- это зависимое имя в CallFoo
: оно зависит от аргумента шаблона T
. Но функция Foo
найдена компилятором, несмотря на нарушение двух из приведенных выше правил.
- Объявление
Foo
не видно ни из определения, ни из экземпляраCallFoo
, потому что оно ниже обоих. Foo
имеет внутреннюю связь.
Маловероятно, что во всех трех компиляторах есть ошибка. Возможно, я что-то неправильно понял. Не могли бы вы подробнее рассказать об этом?
constexpr
. См. здесь, - person Dr. Gut   schedule 26.08.2019Apple
, конечно). - person ustulation   schedule 27.08.2019