在重载决议期间,函数对象的处理方式是否与常规函数不同?如果是这样,怎么做?
我遇到了以下情况,用等效可调用的函数对象替换函数会改变代码的含义:
#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”。到目前为止,一切都很好:ADL 正在找到 N::bar,N::bar 和全局 bar 都是完全匹配的,并且 N::bar 是首选,因为它不是模板。
但是,如果我将全局 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);
}
输出现在是“全局栏”。为什么有区别?