模板的类型推导,能不能推导出"引用"的信息

C++语言 码拜 6年前 (2015-10-20) 456次浏览
如下:

template<class T>
void f(T t)
{
    //cout << std::is_reference<T>::type << endl;
    //remove_reference<T>::type t2 = t;
    //t2 += 2;
    t += 1;
}
int main() {
    int i = 1;
    f(i);
    cout << i << endl;
    int&ri = i;
    f(ri);
    cout << i << endl;
    return 0;
}

我期待,模板函数f,在接受int i的时候推导出T=int,那么t是i的一个拷贝,对它加1不会有影响。

而在接受int& ri参数时,能推导出int&,也就是t是i的一个引用,对t加1就是对i加1.

所以我期待输出结果是1,2

但是实际上输出的结果是1,1
换句话说,似乎模板的类型推导,如果没有显示的声明T&这样的话,那么似乎是会丢掉变量的引用修饰符的。

C++语言的标准对此说了什么吗?

解决方案:10分
#include <iostream>
#include <typeinfo>
int main() {
    int a = 9;
    int&b = a;
    std::cout << "a: " << typeid(a).name() << std::endl;
    std::cout << "b: " << typeid(b).name() << std::endl;
    return 0;
}
解决方案:5分
f函数是传值的,不是引用
解决方案:10分

所以函数 f 里的 t += 1; 真的没有用处。

解决方案:5分
是 int 比 int &更优先匹配,所以推导不到 int&

int 和 int & 实参,都是优先匹配 int 而非 int &

你改成

template<class T>
void f(T& t)
{
    //cout << std::is_reference<T>::type << endl;
    //remove_reference<T>::type t2 = t;
    //t2 += 2;
    t += 1;
}

试试

解决方案:5分
C++ 函数(包括模板)匹配,是按照调用方式,和对应的函数匹配的

引用和值调用形式完全一致,

模板匹配的时候,值调用 优先匹配,所以引用方式就没有机会了。
模板匹配的时候,C++引用信息没有丢失,只是机会差点,很多时候,匹配不上而已。

解决方案:5分
都推导成 int,引用的话需要明确写 &

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明模板的类型推导,能不能推导出"引用"的信息
喜欢 (0)
[1034331897@qq.com]
分享 (0)