这是一个非常简单的示例:
#include <iostream>
template<typename T>
void DoubleMe(T x) {
x += x;
}
int main()
{
int a = 10;
DoubleMe(a);
std::cout << a; //displays 10 not 20!
}
在这种情况下,我是否必须在函数参数中使用“T&”代替?因为我在一些教程中已经读到模板可以通过在变量之前定义一个简单的“T”来正确推断出适当的数据类型,包括T *,T []或T&。救命?
最佳答案
您确实可以使用简单的T
正确推断出引用类型。不幸的是,这并不意味着您认为的意思。
给定
template <typename T> struct S { };
template <typename T> void f(S<T>) { }
int main() { f(S<int&>{}); }
正确将
f
的类型参数推导出为int&
。问题是,在您的情况下,将
T
推导为int
已经产生了一个完全有效的函数。也许稍微简化了一点,但是类型推导产生了使调用正常工作的最简单的T
。在您的情况下,T = int
使调用正常进行。不是您希望它工作的方式,但是编译器无法知道。 T = int &
也可以使调用正常工作,但这不是使它正常工作的最简单的T
。关于c++ - 如果不使用 '&',C++模板将无法推断出引用类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34495592/