【发布时间】:2020-08-06 07:53:13
【问题描述】:
我对标准中的一些规则感到困惑。我会在这里引用它们:
[basic.lookup.argdep]:
令 X 为 非限定查找 生成的查找集,让 Y 为参数相关查找(定义如下)生成的查找集。
所以上面这句话的意思是集合X是由unqualified lookup创建的。然后我们看看非限定查找的规则:
[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)?它不与不合格的查找规则相矛盾吗?如果我遗漏了什么,请纠正我。
【问题讨论】:
-
0是一个整数值。为什么这里有歧义?与func(0.0)比较。 -
@tadman 这里不讲重载解析,只说名字查找,根据不合格查找
-
我只是回应您的代码示例,您没有以不合格的方式使用它。也许你的意思是
func(int i = 0)和func(double i = 0.0)其中func()是不合格的?我不确定你的具体问题,措辞有点模糊。 -
@tadman 为什么您认为我的示例中的
func(0)没有以不合格的方式使用? -
The lookup for an unqualified name used as the postfix-expression of a function call is described in [basic.lookup.argdep].
标签: c++ language-lawyer overload-resolution name-lookup