模板类方法forward(const T)当T为左值引用时无法接受右值的问题
为什么模板类绑定int&时,带const的参数无法接收右值?
核心问题出在当模板参数T是引用类型时,const T的语义和你想的不一样——C++里引用本身不能被const修饰,所以这个const会被直接忽略,导致你的参数类型根本不是const引用。
先拆解原始代码的实例化逻辑
当你实例化A<int&>时,模板参数T = int&,成员函数forward的参数const T t展开后是const (int&) t。但C++标准明确规定:引用的const限定是冗余的,编译器会直接忽略,所以这个参数的实际类型就是int& t——一个非const的左值引用。
这时候你传右值1,C++不允许右值绑定到非const的左值引用,自然就报了你看到的错误。
对比A<int>的情况:T = int,参数是const int t,值传递,右值可以正常拷贝,所以没问题;传左值i给A<int&>的forward时,左值可以绑定到非const左值引用,所以也没问题。
两种解决方法的原理
1. 添加A<T&>的特化版本
特化版本里的模板参数T是被剥离了引用的类型:当你实例化A<int&>时,特化的T是int,所以forward的参数是const T& t,也就是const int& t——这是一个可以绑定右值的const左值引用,自然能接收1。返回值T&也对应int&,符合你的需求。
2. 替换A<int&>为A<const int&>
此时模板参数T = const int&,forward的参数const T t展开为const (const int&) t,同样引用的const被忽略,实际参数类型是const int& t,可以正常绑定右值1,所以错误消失。
补充验证
你可以用typedef来直观感受这个规则:
typedef int& IntRef; const IntRef t; // 编译器会把它当成int& t,const被直接忽略
内容的提问来源于stack exchange,提问作者NotApplicable
相关产品推荐
相关产品推荐

