Jon*_*Mee 0 c++ templates overloading return-type specialization
Mooing Duck 在这里发表评论"一个函数不能返回多个类型.但是,你可以专门化或委托重载,这很好."
我开始考虑这个问题,我想弄清楚,这个法律代码是怎样的:
template <typename T>
T initialize(){ return T(13); }
Run Code Online (Sandbox Code Playgroud)
通话时:
auto foo = initialize<int>();
auto bar = initialize<float>();
Run Code Online (Sandbox Code Playgroud)
这不会转换为仅由return-type重载的2个同名函数吗?
这不是一个过载,它是一个专业化.它们是不同的机制(事实上,将两者混合会导致混淆,因为在考虑专业化之前解决了过载问题 - 请参阅Sutter's Mill的文章,例如:http://www.gotw.ca/publications/mill17.htm).
以下是仅允许重载的不允许返回值的示例:
int initialize();
float initialize();
Run Code Online (Sandbox Code Playgroud)
OTOH,给出主要模板定义
template <typename T>
T initialize(){ return T(13);}
Run Code Online (Sandbox Code Playgroud)
引自这里
为了编译函数调用,编译器必须首先执行名称查找,对于函数,可能涉及依赖于参数的查找,对于函数模板,可以跟随模板参数推断.如果这些步骤产生多个候选函数,则执行重载解析以选择实际调用的函数.
initialize<int>并且initialize<float>仅仅是所述模板的两个不同实例.它们是两个不同的函数,不会成为潜在重载决策候选列表的一部分.