Инициализационные списки списков действительно удобны для инициализации контейнеров С++:
std::vector<int>({1, 2, 3})
... но кажется, что выражение списка инициализаторов, заключенное в фигурной скобке, подобно {1,2,3}
, будет привязываться только к функции, которая принимает std::initializer_list<int>
- она, похоже, не привязана к универсальной (пересылающей) ссылке:
template <class T>
void foo(T&& v)
{
std::vector<int>(std::forward<T>(v));
}
int main()
{
foo({1, 2, 3})
}
Выводится:
test2.cpp:11:6: note: template<class U> void foo(U&&)
test2.cpp:11:6: note: template argument deduction/substitution failed:
test2.cpp:33:13: note: couldn't deduce template parameter ‘U’
(Это был результат с GCC 4.7.2.)
К сожалению, мы не можем перенаправить выражение списка инициализаторов. Поскольку было бы очень удобно это сделать, я хотел бы спросить, почему это не работает? Почему не удается привязать выражение списка инициализаторов в скобках к ссылке пересылки? Или это разрешено, и, возможно, мой компилятор слишком стар?