在下面的简单示例中,我预计输出将为“2222”。但VC ++ 11.0和g ++ 4.6.1的实际输出为“2122”。
#include <iostream>
template <class T>
void func(T x)
{
x = 2;
std::cout << x;
}
int main()
{
int x = 1;
func((int &)x);
std::cout << x;
func<int &>(x);
std::cout << x;
return 0;
}
我反汇编并发现第一个func调用func((int&amp;)x)使用func&lt; int&gt;而不是func&lt; int&amp;&gt;。为什么以及如何发生这种情况?
答案 0 :(得分:4)
模板类型参数推导以这种方式工作。对int&
的强制转换无效,因为变量x
已经是左值。当参数为左值并且参数不是引用时的模板类型推导将推断出类型不是引用。