2014-12-05 59 views

回答

0

下面是从标准描述这意味着隐含对象参数用于重载目的。重载解析开始

之前,通过名称查找和模板参数推导选择的功能被组合以形成该组的候选函数(确切条件取决于其中重载解析发生的上下文中)。

如果任何候选函数是成员函数(静态或非静态),但不是构造函数,则将其视为具有表示调用它们的对象的额外参数(隐式对象参数)出现在第一个实际参数之前。

类似地,在其上被调用的成员函数的对象,被预设于参数列表作为暗示对象参数

对于类X的成员函数,隐式对象参数的类型的影响CV - 成员职能的资格和参考资格。

对于静态成员函数,隐式对象参数被视为匹配任何对象:未检查其类型,并且未尝试转换序列

3

它用来做重载决议更容易理解。

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)重载这里将是高度混淆。

相关问题