在§13.3.1/ 4(N3337),你会发现以下:为什么静态成员函数需要根据§13.3.1/ 4有一个隐含的对象参数?
对于静态成员函数,隐含的对象参数是 认为是匹配的任何对象(因为如果选择了功能,则丢弃对象)。
§9.4.1/ 2具有这一论断:
静态成员函数不具有此指针。
那么,静态成员函数的隐式对象参数的目的是什么?
在§13.3.1/ 4(N3337),你会发现以下:为什么静态成员函数需要根据§13.3.1/ 4有一个隐含的对象参数?
对于静态成员函数,隐含的对象参数是 认为是匹配的任何对象(因为如果选择了功能,则丢弃对象)。
§9.4.1/ 2具有这一论断:
静态成员函数不具有此指针。
那么,静态成员函数的隐式对象参数的目的是什么?
下面是从标准描述这意味着隐含对象参数用于重载目的。重载解析开始
之前,通过名称查找和模板参数推导选择的功能被组合以形成该组的候选函数(确切条件取决于其中重载解析发生的上下文中)。
如果任何候选函数是成员函数(静态或非静态),但不是构造函数,则将其视为具有表示调用它们的对象的额外参数(隐式对象参数)出现在第一个实际参数之前。
类似地,在其上被调用的成员函数的对象,被预设于参数列表作为暗示对象参数
对于类X的成员函数,隐式对象参数的类型的影响CV - 成员职能的资格和参考资格。
对于静态成员函数,隐式对象参数被视为匹配任何对象:未检查其类型,并且未尝试转换序列。
它用来做重载决议更容易理解。
struct S {
void f(int);
static void f(double);
};
int main() {
S::f(1);
}
这里,s::f(1);
简直是一个严重的错误,因为f(int)
比f(double)
更好的匹配,即使f(int)
超载导致硬错误进一步上。
如果规则是任何其他方式,考虑会发生什么这个:
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)
重载这里将是高度混淆。