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

0 ответов

Другие вопросы по тегам