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

时间:2015-04-10 15:20:09

标签: c++ templates c++11 auto 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});

以下是代码实时示例的链接: 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});

decltype是另一个故事,并且不在这个问题的重点,但auto和模板应该做同样的事情(至少那个似乎是合理的,在推断出类型的时候 - 但是,他们显然不会这样做,而且为什么会让人感到困惑?

0 个答案:

没有答案