关于函数名称查找的困惑

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 声明,因此重载解析仍然会发生。