C ++模板使用引用参数隐式实例化

时间:2013-01-16 04:04:33

标签: c++ templates

在下面的简单示例中,我预计输出将为“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;。为什么以及如何发生这种情况?

1 个答案:

答案 0 :(得分:4)

模板类型参数推导以这种方式工作。对int&的强制转换无效,因为变量x已经是左值。当参数为左值并且参数不是引用时的模板类型推导将推断出类型不是引用。