【发布时间】: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/…