Являются ли объектные объекты обработаны по-разному по сравнению с регулярными функциями при разрешении перегрузки? Если да, то как?
Я столкнулся с следующим случаем: замена функции эквивалентным образом вызываемым объектом функции изменила значение кода:
#include <iostream>
namespace N
{
enum E { A, B };
void bar(E mode) { std::cout << "N::bar\n"; }
}
template <typename... Args>
void bar(Args&&... args) { std::cout << "global bar\n"; }
int main()
{
bar(N::A);
}
Здесь вывод "N:: bar". Пока что так хорошо: N:: bar найден ADL, как N:: bar, так и глобальная строка являются точными совпадениями, а N:: bar предпочтительнее, потому что это не шаблон.
Но если я изменяю глобальный бар как объект функции, например:
#include <iostream>
namespace N
{
enum E { A, B };
void bar(E mode) { std::cout << "N::bar\n"; }
}
struct S
{
template <typename... Args>
void operator()(Args&&... args) { std::cout << "global bar\n"; }
};
S bar;
int main()
{
bar(N::A);
}
Выход теперь "глобальная строка". Почему разница?