首页 > 解决方案 > 模板推导中的 const T & 和 T & 有什么区别

问题描述

#for example:

#1:
template <typename T>
void func(T &) {}
int a;
const int b;
func(a);           // T ->  int
func(b);           // T ->  const int
func(5);           // wrong. 5 is a right value

#2:
template <typename T>
void func(const T &) {}
int a;
const int b;
func(a);     // T ->  int
func(b);     // T ->  int   
func(5);     // T ->  int

#3
template <typename T>
void func(T &&) {}
func(5);     // T ->  int

我的问题是:

为什么第一个代码不起作用,为什么这与左/右值有关;

为什么T在第三个不是const int

标签: c++templatestemplate-argument-deduction

解决方案


为什么第一个代码不起作用;为什么这与左/右值有关;

对于第一种情况,T将推导出为int,则参数类型为int &,这是对非常量的左值引用。And5是一个右值,它不能绑定到非 const 的左值引用,然后调用失败。

对于第二种情况,函数的参数类型是const int &,即对 const 的左值引用,它可以绑定到右值,如5

为什么T在第三个不是const int

如果参数不是 type ,则不会添加 模板参数推导。是类型的(它是一个右值),但它的类型不是.constconst5intconst int

另一方面,我们有处理左值/右值的转发参考。例如

template <typename T>
void func(T &&) {}
int a;
const int b;
func(a);           // T ->  int&;       parameter type -> int&
func(b);           // T ->  const int&; parameter type -> const int&
func(5);           // Fine. T ->  int;  paramter type -> int&&

推荐阅读