【发布时间】:2015-07-02 14:11:23
【问题描述】:
想象一下我有以下功能:
#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]
在不合格的函数调用中,名称不是由 -> 或 限定的。 运算符,并且具有更一般的主表达式形式。这 name 在函数调用的上下文中查找 函数调用中名称查找的常规规则 (3.4)。
[...]
参数列表与调用中的表达式列表相同
因此,候选函数将是除foo(B&, B&) 之外的所有foos(参数数量不同)。对吗?
【问题讨论】:
-
你想要候选函数还是可行函数?根据您引用的段落,它们都是候选函数。
-
@chris 不,我想了解候选函数是什么。
-
查看 13.3/2。它首先决定候选函数和参数列表,以便它可以将调用函数的所有不同方式统一到一个统一的候选列表中(例如,将成员函数和非成员函数放在同一个列表中)。然后它会做一些更明显的事情,比如删除参数数量不正确的那些,以获得可行函数的列表。然后在可行函数之间执行重载决议。
标签: c++ overloading language-lawyer