我在网上看到了这段代码:
template <class T, class S>
T f(T& a, T& b, S c) {
T t1, t2, t3;
if (a==b) return t1;
if (c>0) return t2;
return t3;
}
接下来是这些电话:
f('c', 5, 5); // why this doesn't compile?
f(3, 4, 6.0); // why does this compile?
第一个没有编译,而第二个没有..为什么?
答案 0 :(得分:4)
在C ++中(与C相反)'c'
是char
。
您的代码无法编译,因为参数T
的模板参数推断失败 - 它是不明确的。在f('c', 5, 5)
调用中,第一个函数参数表示它应该是char
,第二个函数参数应该是int
。您是如何期望编译器解决这种歧义的呢?
如果你想要T == int
,你可以明确指定第一个模板参数
f<int>('c', 5, 5);
或者您可以使用显式转换
f((int) 'c', 5, 5);
当然,正如已经注意到的那样,即使您完成了模板参数推导问题,您仍然无法使用rvalues初始化非常量左值引用。由于后一种原因,你的两个电话也都是无效的。