4

在下面的简单示例中,我预计输出将是“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 &)x)使用了func<int>而不是func<int &>。这是为什么以及如何发生的?

4

1 回答 1

4

模板类型参数推导就是这样工作的。强制转换为int&无效,因为变量x已经是左值。当参数是左值且参数不是引用时,模板类型推导将推导类型不是引用。

于 2013-01-16T04:08:31.430 回答