c++函数模板实参推断

为什么向com中传递一个引用,无法改变temp的值,而向com1中传递就可以改变呢?难道com这个函数模板传入引用时,不是推断出和com1一样的实例吗?


#include <iostream>
#include <typeinfo>

template <typename T>
void com(T arg) {

    std::cout << "com arg's address = " << &arg << std::endl;
    arg++;
}

void com1(int& arg) {
    std::cout << "com1 arg's address = " << &arg << std::endl;
    arg++;
}

int main(){
    int temp(10);
    std::cout << "main temp's address = " << &temp <<std::endl;
    int& rTemp(temp);
    std::cout << "main rTemp's address = " << &rTemp <<std::endl;
    com(temp);
    std::cout << temp <<std::endl;
    com(rTemp);
    std::cout << temp <<std::endl;
    com1(rTemp);
    std::cout << temp <<std::endl;
    return 0;
}

图片描述

阅读 3.5k
4 个回答

你写void com(T& arg)试试

你的问题出在对引用的理解,和模板没有关系。
引用即别名,所以rtemptemp都是代表同一个内存位置。它们作为普通函数参数传入的时候函数得到的是复制后的局部变量,所以它们不会被修改。但作为引用传入的时候,函数得到的是temprtemp本身,可以修改。

很显然,com在调用的时候模板参数T被推导成了int
本来我还想的很复杂,后来一想com接受的参数不就是int么,引用就是代表变量本身,推导的时候自然是T = int

template <typename T> 
void com(T arg) { // P 如果不是一个引用类型

    std::cout << "com arg's address = " << &arg << std::endl;
    arg++;
}

std::cout << temp <<std::endl;
    com(rTemp); // A 这里的参数传的是`int`!

如果需要,你可以指定模板参数的。使用com<int&>(temp);这样的方式来使用引用类型参数。

下面的代码试试

#include <iostream>
#include <typeinfo>
using namespace std;

int main()
{
  int x = 1000;
  int& rx = x;
  cout<<typeid(x).name()<<endl<<typeid(rx).name();
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题