这是一个非常简单的例子:
#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++ 模板无法推断引用类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34495592/