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)试试
回答:
你的问题出在对引用的理解,和模板没有关系。
引用即别名,所以rtemp
和temp
都是代表同一个内存位置。它们作为普通函数参数传入的时候函数得到的是复制后的局部变量,所以它们不会被修改。但作为引用传入的时候,函数得到的是temp
或rtemp
本身,可以修改。
回答:
很显然,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