c++11 - 为什么模板函数不能推导出大括号初始值设定项,但自动声明的变量可以?
问题描述
众所周知,当大括号初始值设定项直接传递给模板函数时,无法推断类型,编译失败:
template<typename T>
void f(T)
{
// do something
}
f({ 1,2,3 }); // compilation fails.
但是,如果您使用 auto 声明一个变量并使用大括号初始化器对其进行初始化,则类型推导可以正常工作并且推导的类型是std::initializer_list<T>
.
auto arr = { 1,2,3 }; // works fine
现在的问题是,为什么 C++ 标准会出现这样的不一致?如果模板可以将大括号初始值设定项推导出来,会出现什么问题std::initializer_list<T>
?
注意:有很多关于 SO 的问题来自开发人员,他们面临着模板函数初始化列表的推论(例如this one、this one、this one和this)。但我找不到关于这个决定背后的确切原因的问答。
解决方案
推荐阅读
- java - 当应用程序未在 Android 设备中运行时,如何在特定时间发送通知?
- .net - .net 核心中的快速进程间事件
- c++ - 在 C++ 中将字符串转换为句子大小写
- javascript - Laravel 分页方法仅从数据库中获取特定的行数,而不是获取所有数据
- python - Data cleaning while Web-scraping using Beautiful soup
- typescript - 如何拒绝 TypeScript 中具有未知类型的不兼容函数参数
- javascript - 不和谐.js | 发出消息狙击命令
- vim - 在 .vimrc、ftplugin、after/ftplugin 等中设置值后,Vim 最终会应用哪种配置?
- r - R lubridate as_date 不会将日期时间转换为日期
- google-cloud-platform - 从谷歌云存储将数据流式传输到网络