为什么这个模板函数不能编译C++

Why won't this template function compile C++

本文关键字:不能 编译 C++ 函数 为什么      更新时间:2023-10-16

我在互联网上看到了这段代码:

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);

当然,正如已经指出的那样,即使您解决了模板参数推导问题,您仍然无法使用右值初始化非常量左值引用。由于后一个原因,您的两个调用也无效。