【发布时间】:2018-01-08 06:46:40
【问题描述】:
考虑到http://en.cppreference.com/w/cpp/language/adl 中描述的这个示例:
namespace A {
struct X;
struct Y;
void f(int);
void g(X);
}
namespace B {
void f(int i) {
f(i); // calls B::f (endless recursion)
}
void g(A::X x) {
g(x); // Error: ambiguous between B::g (ordinary lookup)
// and A::g (argument-dependent lookup)
}
void h(A::Y y) {
h(y); // calls B::h (endless recursion): ADL examines the A namespace
// but finds no A::h, so only B::h from ordinary lookup is used
}
}
我想知道为什么会出现歧义,因为如果没有考虑 ADL 规则
“通常的非限定查找产生的查找集包含以下任何一项”。
这里的 B::g 可以通过 http://en.cppreference.com/w/cpp/language/unqualified_lookup 中解释的非限定查找找到,这要归功于规则
对于函数定义中使用的名称,无论是在函数体中还是作为默认参数的一部分,如果函数是用户声明或全局命名空间的成员,则在之前搜索使用该名称的块名称的使用,然后在该块的开始之前搜索封闭块,等等,直到到达作为函数体的块。然后搜索声明函数的命名空间,直到使用该名称的函数的定义(不一定是声明),然后是封闭的命名空间等。
那么我的问题是为什么在这种情况下会考虑 ADL 规则?
【问题讨论】:
-
您能否详细说明为什么您认为它不应该被考虑在内?
-
首先,如果通常的非限定查找产生的查找集包含以下任何一项,则不考虑依赖参数的查找:
-
1) 类成员的声明 2) 块范围内的函数声明(这不是 using 声明) 3) 任何不是函数或函数模板的声明(例如函数对象或名称与正在查找的函数名称冲突的另一个变量)
-
我在这段代码 sn-p 中看不到这三个。
-
那么如果通过非限定查找找到的函数找到但不在块范围内,是否考虑ADL规则?
标签: c++ argument-dependent-lookup name-lookup