在§13.3.1/ 4(N3337)中,您将找到以下内容:
对于静态成员函数,隐式对象参数是 被认为匹配任何对象(因为如果选择了该函数,则 对象被丢弃了。)
§9.4.1/ 2有这个断言:
静态成员函数没有this指针。
那么,静态成员函数的隐式对象参数的目的是什么?
答案 0 :(得分:3)
用于使重载分辨率更容易理解。
struct S {
void f(int);
static void f(double);
};
int main() {
S::f(1);
}
此处s::f(1);
只是一个硬错误,因为f(int)
是一个比f(double)
更好的匹配,即使f(int)
重载会导致进一步的硬错误。< / p>
如果规则是其他任何方式,请考虑会发生什么:
template <typename T>
struct U : S {
void u() {
S::f(1);
}
};
template <typename T>
struct V : U<T> {
void v() {
S::f(1);
}
};
这里,U::u
显然是有效的,并调用成员函数。但是,V<T>
具有类型相关的基类,因此在模板定义时不知道从S
派生。让S::f
解决f(double)
重载问题会非常困惑。
答案 1 :(得分:0)
下面是标准的描述,暗示隐式对象参数用于重载目的。
在重载解析开始之前,通过名称查找和模板参数推导选择的函数被组合起来形成一组候选函数(确切的标准取决于发生重载解析的上下文)。
如果任何候选函数是成员函数(静态或非静态),而不是构造函数,则将其视为具有额外参数(隐式对象参数),该参数表示调用它们的对象并显示在第一个实际参数之前。
类似地,调用成员函数的对象作为隐含对象参数被添加到参数列表之前
对于类X的成员函数,隐式对象参数的类型受成员函数的cv-qualifications和ref-qualifications的影响。
对于静态成员函数,隐式对象参数被认为与任何对象匹配:未检查其类型,并且未尝试对其进行转换序列。