Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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
,使用type
char 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&&