带有引用参数的c++模板隐式实例化

C++ template implicit instantiation with reference parameter

本文关键字:实例化 c++ 引用 参数      更新时间:2023-10-16

在下面的简单示例中,我预计输出将是"2222"。但是vc++ 11.0和vc++ 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((int &)x)使用了func而不是func。为什么会发生这种情况?

模板类型参数的演绎就是这样的。强制转换为int&没有效果,因为变量x已经是左值了。当实参为左值且形参不是引用时,模板类型推导将推断该类型不是引用。