C++中同解析类型的函数模板优先级是否低于普通函数?特殊成员有特殊规则吗?
问题1:构造函数重载优先级
你遇到的场景有明确的C++标准规则约束,不属于实现定义行为,核心规则如下:
- 构造函数模板无论签名是否匹配,都不会被认定为拷贝构造函数,因此不会抑制类的隐式拷贝构造函数生成。
- 重载决议的优先级判断分两步走:
- 首先比较参数的匹配程度,更优的参数转换序列对应的重载优先被选中。你给出的示例中,模板构造的参数是
Class<U>&(非const左值引用),而隐式生成的拷贝构造默认签名是Class(const Class<T>&),传入非const的foo时,绑定到非const引用的匹配度更高,因此此时会优先调用模板构造函数。 - 如果出现你假设的签名完全一致的场景:比如你显式声明了签名为
Class(Class<T>&)的拷贝构造,或者类的基类、成员的拷贝构造都接受非const引用,导致隐式生成的拷贝构造签名为Class(Class<T>&),此时标准明确规定非模板函数的优先级高于模板函数的完全匹配实例,会优先调用非模板的拷贝构造函数。
- 首先比较参数的匹配程度,更优的参数转换序列对应的重载优先被选中。你给出的示例中,模板构造的参数是
问题2:普通成员函数重载的差异
特殊成员函数不会在重载决议中获得额外的优先级优待,普通成员函数的重载规则和构造函数完全一致。
你给出的foo函数示例中,非模板版本的foo(Vector &other)和模板实例化后的foo(Vector<int> &other)签名完全一致,按照「非模板优于模板」的规则,会优先调用非模板版本的foo函数,和构造函数场景的判断逻辑没有区别。
内容的提问来源于stack exchange,提问作者QuaternionsRock
相关产品推荐
相关产品推荐

