Почему я не могу преобразовать [] (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){}