C++如何在存在歧义的模板重载中选择匹配版本?
模板重载选择的困惑:为什么编译器不会报歧义?
我在读《Effective Modern C++》里的模板类型推导内容时,已经搞懂了编译器怎么判断模板是否匹配、怎么推导类型,但就是弄不明白,当多个重载模板都匹配时,编译器是怎么挑选的。
看下面这段代码:
#include <iostream> template <typename T> void hello(T& a) { std::cout << "Hello World 1" << std::endl; } template <typename T> void hello(const T& a) { std::cout << "Hello World 2" << std::endl; } int main() { int x = 6; const int y = 5; int& z = x; hello(x); hello(y); hello(z); }
它的输出是:
Hello World 1 Hello World 2 Hello World 1
从结果看,输入const类型参数时,编译器选了带const的重载版本,这感觉合理,但我原本以为这种情况会因为歧义报错。而且不管删掉哪个hello函数版本,剩下的代码都能正常编译,所有调用都会用剩下的那个版本,这说明编译器有一套机制来选择“更合适”的模板,从而避免歧义。
我知道模板推导里有个偏序过程,但把这套逻辑用到这个场景里就搞不懂了。按偏序的说法,模板本身有优先级排序,更特化的模板会被优先选中,不管输入参数类型是什么,但这显然和我示例里编译器根据输入类型选择不同版本的情况矛盾。
内容的提问来源于stack exchange,提问作者starswap
相关产品推荐
相关产品推荐

