根据cppreference,在Argument-dependent查找
除了通常的非限定名称查找所考虑的范围和名称空间之外,还在其参数的名称空间中查找函数名称。
但是,为什么在下面的函数 A::member_function() 示例中,选择了类方法begin(),其中 1) 采用 0 个参数,而 2) 甚至不在 std::vector 的命名空间中,函数的参数?ADL 不应该转到参数的命名空间(对于向量来说是 std)并选择自由函数 std::begin() 吗?
#include <unordered_map>
#include <vector>
class A
{
public:
using value_t = std::unordered_map<int, char>;
public:
void member_function();
value_t::iterator begin() { return map_.begin(); }
private:
value_t map_;
};
void A::member_function()
{
std::vector<int> hello;
auto it = begin(hello);
}
如果这真的是 ADL 的工作方式,我也很高兴有一个解决方法。