c++ - 模板推导中的 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
解决方案
为什么第一个代码不起作用;为什么这与左/右值有关;
对于第一种情况,T
将推导出为int
,则参数类型为int &
,这是对非常量的左值引用。And5
是一个右值,它不能绑定到非 const 的左值引用,然后调用失败。
对于第二种情况,函数的参数类型是const int &
,即对 const 的左值引用,它可以绑定到右值,如5
。
为什么
T
在第三个不是const int
如果参数不是 type ,则不会添加 模板参数推导。是类型的(它是一个右值),但它的类型不是.const
const
5
int
const 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&&
推荐阅读
- python - mha 脑肿瘤文件中的图像数据
- entity-framework - EF Core 的 lambda 表达式中无法识别的成员 ThenInclude 在 Extension 方法中
- serial-port - Qemu 连接到特定的访客 UART 设备
- reactjs - 使用 17.0.1 版本的 React App 中使用的调查 JS?
- for-loop - 如何将for转换为foreach
- sql - UNION 两个 SELECT 查询,但结果集小于其中一个
- redis - 使用 sha 值获取 Redis 脚本的代码
- node.js - Nestjs readFileSync返回无法读取未定义的属性'readFileSync'
- javascript - 沿轴显示来自 JSON 的值
- spring - Spring Data JDBC Kotlin NoSuchMethod 错误:Dialect.getIdGeneration()