Почему я не могу преобразовать [] (auto &&...) {} в функцию std :: <void()> ?

Когда я пытаюсь скомпилировать это:

#include <functional>

void f(std::function<void()> f)
{
}

void g()
{
  f([](auto&&...){});
}

на gcc 7.3, я получаю следующую ошибку:

[x86-64 gcc 7.3 # 1] error: невозможно преобразовать ' <lambda closure object>g()::<lambda(auto:1&&,...)>{} ' from ' g()::<lambda(auto:1&&,...)> 'to' std::function<void()> '

Может кто-нибудь объяснить, почему это недействительно c++? Или я должен представить отчет об ошибке? (MSVC 14 принимает и компилирует его к тому, что я ожидаю.)

Ответ 1

Это ошибка gcc. Он интерпретирует вашу лямбду следующим образом:

[](auto&&, ...){}

Итак, есть один аргумент, за которым следует C variadic.

Если вы добавите имя в свой пакет параметров, он будет работать в соответствии с назначением:

[](auto&&... pack){}