Mooing Duck发表评论here“一个函数无法返回多个类型。但是,您可以专门化或委托重载,这样可以正常工作。”
我开始考虑这个问题,而我想弄明白,这个法律代码是怎样的:
template <typename T>
T initialize(){ return T(13); }
使用时调用:
auto foo = initialize<int>();
auto bar = initialize<float>();
这不会转换为仅由return-type重载的2个同名函数吗?
答案 0 :(得分:6)
这不是一个过载,它是一个专业化。它们是不同的机制(实际上混合两者可能会导致混淆,因为在考虑专业化之前解决了过载问题 - 请参阅Sutter的Mill文章,例如:http://www.gotw.ca/publications/mill17.htm)。
答案 1 :(得分:6)
这里有一个不允许的返回值只有重载的例子:
int initialize();
float initialize();
OTOH,给出主要模板定义
template <typename T>
T initialize(){ return T(13);}
引自here
为了编译函数调用,编译器必须首先执行名称查找,对于函数,可能涉及依赖于参数的查找,而对于函数模板,可能后跟模板参数推断。如果这些步骤产生多个候选函数,则执行重载解析以选择实际调用的函数。
initialize<int>
和initialize<float>
只是所述模板的两个不同实例。它们是两个不同的函数,不会成为潜在重载决策候选列表的一部分。