我在互联网上看到了以下代码:
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?
第一个不编译,而第二个则编译。为什么?
在C ++中(与C相反)'c'
是一个char
。
您的代码无法编译,因为参数的模板参数推导T
失败-它是模棱两可的。在f('c', 5, 5)
调用中,第一个函数参数说应该char
,第二个参数说应该int
。您如何期望编译器解决这种歧义?
如果需要T == int
,可以显式指定第一个模板参数
f<int>('c', 5, 5);
或者您可以使用显式强制转换
f((int) 'c', 5, 5);
当然,正如已经指出的那样,即使您解决了模板参数推导问题,您仍将无法使用rvalues初始化非恒定的左值引用。由于后一个原因,您的两个电话也都无效。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句