c++ - 推导的模板 arg 和自动 arg 之间有什么区别吗?
问题描述
这两个功能在任何有意义的方面有什么不同吗?有什么理由通常更喜欢一个而不是另一个?
void foo(auto x, auto &... y) { /* ... */ }
template<typename T, typename... Tx>
void foo(T x, Tx &... y) { /* ... */ }
当我不需要 T 类型时,我倾向于使用第一个,因为它更短……但我想知道是否有任何缺点。
解决方案
在所示示例中,两个版本之间绝对没有区别。两者都是不受约束的函数模板,它们按值采用 1 个任何类型的参数,然后按引用采用 0 个或多个任何类型的参数。
就个人而言,和你一样,我更喜欢第一个,因为它打字更少,更容易阅读。
用一种形式替换另一种形式时需要小心,例如:
template<typename T>
void foo(T x, T y) { /* ... */ } // #1
和
void foo(auto x, auto y) { /* ... */ } // #2 // not equivalent to #1
是不正确的,因为与 in 不同,不需要x
和y
具有相同的类型。#2
#1
推荐阅读
- python - Pandas:如何将字典映射到 2 列?
- python - 在 python 日志记录中显示线程 native_id
- r - 如何获得数据框中最常见的 3 个元素?
- javascript - 如何使用 webpack 在 ES6 项目中加载 Bootstrap 5 jQuery 插件?
- amazon-web-services - 预热 S3 分区
- excel - 如何从过滤器函数中删除重复项
- asp.net-core - 如何在 Razor Pages 中加载图像/字节数组
- javascript - Angular 11 - 将指令从自定义元素传递到子材质按钮
- javascript - React Router Link 更改 URL 但不呈现组件 - 休息国家 API
- c++ - C++:多态性、初始化列表和 const 变量