C++成员函数的依赖非限定名的两阶段查找

C++ two-phase lookup for dependent unqualified name of member function

本文关键字:段查找 查找 函数 成员 依赖 C++      更新时间:2023-10-16

Josuttis和Vandervoorde提到,对于依赖的非限定名称,编译器在第一阶段应用普通查找,在第二阶段应用ADL。然后它结合了过载集。像这样:

struct B{};
void bar(int){} // first overload
template <class T>
void foo(T t)
{
  bar(2, t);
}
void bar(int, B){} // second overload
int main() {
    foo(B{}); // works just fine, calls second overload
}

但是,如果依赖名称是成员函数的名称,则此原则不起作用:

struct B{};
struct A{
  template <class T>
  void foo(T t)
  {
    bar(2, t);
  }
  void bar(int){} // first overload
};
void bar(int, B){} // second overload
int main() {
  A a;
  a.foo(B{}); // gives error
}

这是为什么呢?我想知道是否有人可以指出标准中的笔记

我在标准中找到了一个语句3.4.2:

设 X 为非限定查找生成的查找集,设 Y 为。 由参数相关查找生成的查找集。如果 X 包含:

  • 集体成员声明,或

  • 不是 using 声明的块作用域函数声明,或

  • 既不是函数也不是函数模板的声明

则 Y 为空。