想象一下我具有以下功能:

#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/

10-11 16:08