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
和模板应该做同样的事情(至少那个似乎是合理的,在推断出类型的时候 - 但是,他们显然不会这样做,而且为什么会让人感到困惑?