Куда пропадает информация о типах аргументов в std::future? C++
Набросал вот такой короткий пример.
void increment(int *i)
{
++(*i);
}
template<typename Func, typename ...Args>
auto bar(Func &&task, Args&& ...args)
{
return std::async(std::launch::deferred, std::forward<Func>(task),
std::forward<Args>(args)...);
}
int main()
{
int i = 1;
auto f = bar(&increment, &i);
f.wait();
std::cout << i << std::endl;
return 0;
}
Здесь в std::async
толкается функция типа void(*int)
. При этом async
возвращает std::future<void>
. Но, получается, что если я в std::async
толкну функция типа void(*int, *char)
, то всё равно мне вернется std::future<void>
.
Вопрос: куда девается информация об аргументах? void(*int)
и void(*int, *char)
- это ведь разные типы, почему они оба могут храниться в std::future<void>
?
P.S. :
void(*int)
и void(*int, *char)
- разные типы. В таком случае как они могут храниться в одном типе std::future<void>
? Как это может работать? Если внутри std::future
лежит указатель на функцию типа void(*int)
, то void(*int, *char)
туда уже не положишь. Но оно кладется. Почему?