关于函数名称查找的困惑
A confusion about function name lookup
我对标准中的一些规则感到困惑。我会在这里引用它们:
[basic.lookup.argdep]:
Let X be the lookup set produced by unqualified lookup and let Y be the lookup set produced by argument dependent lookup (defined as follows).
所以上面这句话的意思是集合X是由非限定查找创建的。然后我们看不合格查找的规则:
[basic.lookup.unqual]:
In all the cases listed in [basic.lookup.unqual], the scopes are searched for a declaration in the order listed in each of the respective categories; name lookup ends as soon as a declaration is found for the name.
强调的部分"name lookup ends as soon as a declaration is found for the name"表示一旦找到名字,查找就停止
所以我的问题是:
void func(int){}
void func(double){}
int main(){
func(0);
}
考虑上面的代码。 fun
的名称以不合格的方式使用。因此执行不合格的查找规则。因此,一旦找到 func(double)
或 func(int)
,查找就会停止。那么,为什么func
可以重载,即候选函数集同时包含func(int)
和func(double)
呢?它不与不合格的查找规则相矛盾吗?如有遗漏,请指正。
合理的问题。相关部分是"the scopes are searched for a declaration in the order listed"。
在伪代码中
for (auto scope: scopes)
{
if (scope.contains(name))
return scope;
}
throw ill_formed(name);
一旦找到一个包含 name
的范围,就会选择该范围。不搜索列表中的其他范围。即使 name
出现在该范围内,它也不会参与重载决议。
然而,在您的示例中,所选范围包含的不是一个而是两个 func
声明,因此重载解析仍然会发生。
我对标准中的一些规则感到困惑。我会在这里引用它们:
[basic.lookup.argdep]:
Let X be the lookup set produced by unqualified lookup and let Y be the lookup set produced by argument dependent lookup (defined as follows).
所以上面这句话的意思是集合X是由非限定查找创建的。然后我们看不合格查找的规则:
[basic.lookup.unqual]:
In all the cases listed in [basic.lookup.unqual], the scopes are searched for a declaration in the order listed in each of the respective categories; name lookup ends as soon as a declaration is found for the name.
强调的部分"name lookup ends as soon as a declaration is found for the name"表示一旦找到名字,查找就停止
所以我的问题是:
void func(int){}
void func(double){}
int main(){
func(0);
}
考虑上面的代码。 fun
的名称以不合格的方式使用。因此执行不合格的查找规则。因此,一旦找到 func(double)
或 func(int)
,查找就会停止。那么,为什么func
可以重载,即候选函数集同时包含func(int)
和func(double)
呢?它不与不合格的查找规则相矛盾吗?如有遗漏,请指正。
合理的问题。相关部分是"the scopes are searched for a declaration in the order listed"。
在伪代码中
for (auto scope: scopes)
{
if (scope.contains(name))
return scope;
}
throw ill_formed(name);
一旦找到一个包含 name
的范围,就会选择该范围。不搜索列表中的其他范围。即使 name
出现在该范围内,它也不会参与重载决议。
然而,在您的示例中,所选范围包含的不是一个而是两个 func
声明,因此重载解析仍然会发生。