#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, оно дает предупреждение для выделенной строки, в которой указано deducing ‘T’ as ‘std::initializer_list<std::initializer_list<int> >’
, и ошибка для выделенной строки, обозначающая no matching function for call to ‘bar(<brace-enclosed initializer list>)’
. Почему gcc может вывести тип первого вызова в бар, но не второй, и есть ли способ исправить это, кроме долгого и уродливого литья?