Почему существует различие между шаблоном и автоматическим удержанием типа для случая с краем std::initializer_list?
По сути, в 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
и шаблоны должны делать то же самое (по крайней мере, это то, что кажется разумным) при выводе типа - но они, очевидно, не делают, и это сбивает с толку, почему?