【问题标题】:C++ two-phase lookup for dependent unqualified name of member functionC ++两阶段查找成员函数的相关非限定名称
【发布时间】:2015-03-18 02:34:09
【问题描述】:

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
}

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

【问题讨论】:

  • 这与模板无关。名称查找不会执行 ADL,并且如果找到具有所搜索名称的成员函数,则不会继续封闭范围。 Example
  • 很不方便理解
  • (非限定)名称查找从本地范围到外部进行。只要在某个范围 A 中找到名称,它就会停止。然后不再搜索 A 的封闭范围(名称已经找到)。然后,执行(纯)ADL - 但前提是尚未找到名称,或者已找到的名称不是成员函数。成员函数优先于外部的一切。
  • 会不会和这个有关? stackoverflow.com/questions/25031253/…

标签: c++ templates


【解决方案1】:

我在标准中找到了一个声明 3.4.2:

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

  • 类成员的声明,或

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

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

那么 Y 为空。

【讨论】:

    猜你喜欢
    • 2014-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-27
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多