关于函数名称查找的困惑

时间:2020-04-23 04:53:43

标签: c++ language-lawyer overload-resolution name-lookup

我对标准中的一些规则感到困惑。我在这里引用它们:

[basic.lookup.argdep]

让X为由不合格的查询生成的查询集,让Y为由参数相关查询(定义如下)生成的查询集。

所以上面的句子表示集合X是由不合格的查找创建的。然后,我们查看不合格查找的规则:

[basic.lookup.unqual]

在[basic.lookup.unqual]中列出的所有情况下,都将在范围内搜索各个类别中列出的顺序的声明;找到名称声明后,名称查找就会结束

强调的部分“一旦找到名称声明,名称查找就会结束”表示一旦找到名称,查找就会停止。

所以我的问题是:

void func(int){}
void func(double){}
int main(){
  func(0);
}

考虑以上代码。 fun的名称使用不合格。因此,将执行不合格的查找规则。因此,一旦找到func(double)func(int),查询就会停止。因此,为什么func会被重载,即候选函数集同时包含func(int)func(double)?它与不合格的查找规则矛盾吗?如果我错过了什么,请纠正我。

1 个答案:

答案 0 :(得分:3)

合理的问题。相关部分是“在作用域中以列出的顺序搜索搜索声明”。

使用伪代码

for (auto scope: scopes)
{
   if (scope.contains(name))
      return scope;
}
throw ill_formed(name);

一旦找到一个包含name的范围,就选择该范围。不搜索列表中的其他范围。即使name出现在该范围内,它也不会参与重载解析。

但是在您的示例中,所选作用域不包含一个func声明,而是包含两个声明,因此仍然会发生重载解析。

相关问题