按返回类型重载模板

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个同名函数吗?

Nat*_*one 6

这不是一个过载,它是一个专业化.它们是不同的机制(事实上,将两者混合会导致混淆,因为在考虑专业化之前解决了过载问题 - 请参阅Sutter's Mill的文章,例如:http://www.gotw.ca/publications/mill17.htm).


Pra*_*han 6

以下是仅允许重载的不允许返回值的示例:

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>仅仅是所述模板的两个不同实例.它们是两个不同的函数,不会成为潜在重载决策候选列表的一部分.