首页 > 解决方案 > 为什么模板函数不能推导出大括号初始值设定项,但自动声明的变量可以?

问题描述

众所周知,当大括号初始值设定项直接传递给模板函数时,无法推断类型,编译失败:

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 onethis onethis onethis)。但我找不到关于这个决定背后的确切原因的问答。

标签: c++11templatesc++14type-deduction

解决方案


推荐阅读