C++ 什么';const T&;及T&;模板内演绎 #例如: #1: 模板 void func(T&){} INTA; 常数int b; func(a);//T->int func(b);//T->const int func(5);//错。5是一个正确的值 #2: 模板 void func(常数T&){} INTA; 常数int b; func(a);//T->int func(b);//T->int func(5);//T->int #3 模板 void func(T&){} func(5);//T->int
我的问题是: 为什么第一个代码不起作用,为什么它与左/右值相关 为什么第三行中的C++ 什么';const T&;及T&;模板内演绎 #例如: #1: 模板 void func(T&){} INTA; 常数int b; func(a);//T->int func(b);//T->const int func(5);//错。5是一个正确的值 #2: 模板 void func(常数T&){} INTA; 常数int b; func(a);//T->int func(b);//T->int func(5);//T->int #3 模板 void func(T&){} func(5);//T->int,c++,templates,template-argument-deduction,C++,Templates,Template Argument Deduction,我的问题是: 为什么第一个代码不起作用,为什么它与左/右值相关 为什么第三行中的T不是const int 为什么第一个代码不起作用;为什么这与左/右值有关 对于第一种情况,T将被推断为int,然后参数类型为int&,这是对非常量的左值引用。5是一个右值,不能绑定到非常量的左值引用,然后调用失败 对于第二种情况,函数的参数类型是const int&,即对const的左值引用,可以绑定到右值,如5 为什么第三行中的T不是const int 如果参数不是const类型,则模板参数推断不会添加const
T
不是const int
为什么第一个代码不起作用;为什么这与左/右值有关
对于第一种情况,T
将被推断为int
,然后参数类型为int&
,这是对非常量的左值引用。5
是一个右值,不能绑定到非常量的左值引用,然后调用失败
对于第二种情况,函数的参数类型是const int&
,即对const的左值引用,可以绑定到右值,如5
为什么第三行中的T
不是const int
如果参数不是const
类型,则模板参数推断不会添加const
5
的类型为int
(它是一个右值),但它的类型不是const int
另一方面,我们有处理左值/右值的方法。e、 g
#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
模板
void func(T&){}
INTA;
常数int b;
func(a);//T->int&;参数类型->int&
func(b);//T->const int&;参数类型->常量int&
func(5);//好的T->int;参数类型->int&&
这一切都归结于表达式的属性<代码>5是一个表达式。它有一个类型和一个值类别。5
的类型是int
,不是const int
,而是纯int
。这是一个prvalue(价值类别)
因此,当根据5
推断T&
时,类型只能推断为int
。这意味着合成函数接受一个不能绑定到右值的int&
在推导
T常量&
时,类型T
仍然只能根据模板参数推导中的适当规定推导为int
。但是现在合成的函数接受一个int常量&
,它可以很好地绑定到右值。但这是一个模板。为什么不能推导到常数int&在第一种情况下,T变成常数int。为什么T不能推导为常数int@BAKEZQ-因为没有给它一个常量int
来进行推断,所以给它一个int
5(作为文本)具有类型int
void compare(T*,T*);比较(“qw”、“qwe”)
这是如何工作的。函数给出了一个常量char*
。然后如何解释这个推断。@BAKEZQ-要解释什么?字符串文字是另一种野兽。首先,它们是左撇子。对于某些N
,使用typechar const[N]
。因此,当它们衰减到指针时,const
保持不变。
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&&