为什么std :: initializer_list边缘情况的模板和自动类型推导之间存在差异?

mr.*_*.pd 7 c++ templates auto c++11 type-deduction

基本上C++ 11中有三种类型的演绎:

  • 模板
  • auto
  • decltype

对于大多数情况,类型推导auto和模板似乎以相同的方式起作用.但有一种情况 - 当我们将auto变量设置为由括号封闭的{}初始化程序生成的值时,我们会得到编译错误

no match for call to '(std::initializer_list<int>) (<brace-enclosed initializer list>)' foo({0, 1, 2, 3});
Run Code Online (Sandbox Code Playgroud)

以下是代码实时示例的链接:http: //ideone.com/ODBAZ5

//foo's type would be deduced as std::initializer_list<int>
auto foo = {0, 1, 2, 3}; 

template<typename T> 
void bar(T t){};

//compiles fine
bar( foo );

//next line gives compiler error
bar({0, 1, 2, 3});
Run Code Online (Sandbox Code Playgroud)

decltype是一个完整的另一个故事,并且在这个问题的旁边,但是auto模板应该做同样的事情(至少那些看似合理的东西),当推断出类型时 - 但是它们显然不会,而且它会让人感到困惑为什么?