C ++两阶段查找成员函数的从属非限定名称

时间:2015-01-19 23:57:26

标签: c++ templates

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
}

为什么? 我想知道是否有人可以指出标准

的笔记

1 个答案:

答案 0 :(得分:0)

我在标准中发现了一个声明 3.4.2:

  

设X是由非限定查找生成的查找集,让Y为   由参数依赖查找生成的查找集。如果X包含:

     
      
  • 类成员声明,​​或

  •   
  • 块范围函数声明,它不是using声明,或

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

然后Y是空的。