Зависимый от аргумента поиск в переполнении стека

Как это работает? Это связано с ADL?

#include <iostream>

template <typename T>
struct A
{
friend void f(T x)
{
std::cout << "A\n";
}
};

int main()
{
f(new A<void*>());
}

Может кто-нибудь сказать мне, почему я не могу использовать что-то вроде

f(A<int>());

7

Решение

f(new A<void*>());

Действительно работает из-за Поиск, зависящий от аргумента / поиск Кенига(ADL)
Поиск Кенига гласит:

Вам не нужно указывать пространство имен (область) для функций, если в пространстве имен функции определен один или несколько типов аргументов.

Рассмотрим упрощенный пример не использовать шаблоны, и это должно помочь вам лучше понять ADL на работе:

#include <iostream>
struct A
{
friend void f(A x)
{
std::cout << "A\n";
}
};

int main()
{
f(A());
return 0;
}

Выход:

A

Когда вы используете f(A<int>())это обязывает f() требует аргумент типа int, но ваша структура не обеспечивает какого-либо преобразования из A в int и, следовательно, ошибка.

Если вы предоставите соответствующее преобразование, то оно также будет работать. Что-то вроде:

operator int(){return 1;}
13

Другие решения

Других решений пока нет …