这是一个非常简单的例子:
#includetemplate void DoubleMe(T x) { x += x; } int main() { int a = 10; DoubleMe(a); std::cout << a; //displays 10 not 20! }
在这种情况下,我是否被迫在函数参数中使用'T&'?Cuz我在一些教程中读到模板可以正确地推导出适当的数据类型,包括T*,T []或T&只需在变量之前定义一个简单的'T'.救命?
是的,要获得您想要的效果,您必须添加&符号.
在编写时,模板可以正确推断数据类型.但是,他们可以推断出意图.在这种情况下,传递它的类型是一个整数,并且它正确地实例化一个整数函数,该函数在内部将按值传递给它的参数加倍.您认为函数具有副作用的事实不是编译器可以猜到的.
你确实可以用plain来正确推导出引用类型T
.不幸的是,这并不意味着你认为它意味着什么.
特定
templatestruct S { }; template void f(S ) { } int main() { f(S {}); }
类型参数f
被正确推导为int&
.
问题是,你的情况,推断T
为int
已经产生了非常有效的作用.也许是略微过度简化,但类型推导产生最简单T
的调用工作.在您的情况下,T = int
使呼叫工作.不是你希望它的工作方式,但编译器无法知道.T = int &
也可以使呼叫工作,但它不是最简单的T
使它工作.