想象一下我具有以下功能:
#include <iostream>
class A{ };
class B{ };
void foo(A&& a){ std::cout << "A&&" << std::endl; };
void foo(A& a){ std::cout << "A&" << std::endl; };
void foo(B& b, B& bb){ std::cout << "B&, B&" << std::endl; };
void foo(B& b){ std::cout << "B&" << std::endl; };
void foo(const A& a){ std::cout << "const A&" << std::endl; };
A a;
int main()
{
foo(a);
}
当我们调用函数
foo(a)
时,候选函数集将是什么?标准说:13.3.1.1.1调用命名函数[over.call.func]
因此,候选函数将是
foo
之外的所有foo(B&, B&)
(参数数量不同)。那正确吗? 最佳答案
来自[over.call.func]:
这只是不合格的查找。因此,候选函数是任何名为foo
的函数。也就是说,所有这些:
void foo(A&& );
void foo(A& );
void foo(B& , B& );
void foo(B& );
void foo(const A& );
不管参数数量是否匹配或是否可以进行任何转换都无关紧要-第一步只是名称查找。这就是为什么该术语是候选函数。这些都是候选人,我们还没有排除任何东西。
除此之外,我们确定参数列表。这是您引用的第二个片段,其全文为:
我们这里是第一种情况。因此,在这种情况下,我们有5个候选函数和一个
a
的参数列表。关于c++ - 候选功能集,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31186912/