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;

}

图片描述

回答:

你写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();

}

以上是 c++函数模板实参推断 的全部内容, 来源链接: utcz.com/p/191964.html

回到顶部