我对标准中的一些规则感到困惑。我在这里引用它们:
让X为由不合格的查询生成的查询集,让Y为由参数相关查询(定义如下)生成的查询集。
所以上面的句子表示集合X是由不合格的查找创建的。然后,我们查看不合格查找的规则:
在[basic.lookup.unqual]中列出的所有情况下,都将在范围内搜索各个类别中列出的顺序的声明;找到名称声明后,名称查找就会结束。
强调的部分“一旦找到名称声明,名称查找就会结束”表示一旦找到名称,查找就会停止。
所以我的问题是:
void func(int){}
void func(double){}
int main(){
func(0);
}
考虑以上代码。 fun
的名称使用不合格。因此,将执行不合格的查找规则。因此,一旦找到func(double)
或func(int)
,查询就会停止。因此,为什么func
会被重载,即候选函数集同时包含func(int)
和func(double)
?它与不合格的查找规则矛盾吗?如果我错过了什么,请纠正我。
答案 0 :(得分:3)
合理的问题。相关部分是“在作用域中以列出的顺序搜索搜索声明”。
使用伪代码
for (auto scope: scopes)
{
if (scope.contains(name))
return scope;
}
throw ill_formed(name);
一旦找到一个包含name
的范围,就选择该范围。不搜索列表中的其他范围。即使name
出现在该范围内,它也不会参与重载解析。
但是在您的示例中,所选作用域不包含一个func
声明,而是包含两个声明,因此仍然会发生重载解析。