Шаблоны не всегда угадывают типы списков инициализаторов

#include <initializer_list>
#include <utility>

void foo(std::initializer_list<std::pair<int,int>>) {}
template <class T> void bar(T) {}

int main() {
    foo({{0,1}});  //This works
    foo({{0,1},{1,2}});  //This works
    bar({{0,1}});  //This warns
    bar({{0,1},{1,2}});  //This fails
    bar(std::initializer_list<std::pair<int,int>>({{0,1},{1,2}}));  //This works
}

Это не компилируется в gcc 4.5.3, это дает предупреждение для отмеченной строки, говорящей , выводящей 'T' как 'std :: initializer_list >' и ошибка для отмеченной строки: нет соответствующей функции для вызова 'bar (<список инициализаторов в фигурных скобках>)' . Почему gcc может определить тип первого вызова bar, но не второго, и есть ли способ исправить это, кроме длинного и уродливого приведения?

11
задан Johannes Schaub - litb 8 October 2011 в 22:48
поделиться