为何C++中decltype(auto)可推导返回T&,显式指定T&却不生效?
问题原因分析
这个问题核心和模板参数推导、引用类型绑定规则、decltype(auto)的推导规则相关,具体拆解如下:
- 首先做模板实例化推导:使用
MyClass<int &>实例化模板时,会匹配到偏特化template<typename T> struct MyClass<T &>,因此偏特化中的模板参数T会被推导为int。
foo方法编译失败的原因
- foo的返回类型显式声明为
T &,代入T=int后就是int &,属于非const左值引用。 - foo中return的表达式是
std::move(*value):value的类型是T*也就是int*,*value是int类型的左值,std::move会将它转为int&&类型的将亡值,属于右值范畴。 - C++标准明确规定:非const左值引用不允许绑定到右值,因此return语句出现类型不匹配,直接编译失败。
bar方法正常编译的原因
- bar用
decltype(auto)作为返回类型,它会按照decltype的语义推导返回值类型:对于return的表达式std::move(*value),decltype作用于将亡值会得到右值引用类型,也就是int&&。 - 主函数中用
const int &接收返回值,const左值引用是允许绑定到右值的,不存在类型冲突,因此可以正常编译运行。
内容的提问来源于stack exchange,提问作者Juergen
相关产品推荐
相关产品推荐

