Наборы перегрузки не могут быть отправлены в качестве параметра как есть, они должны быть сначала преобразованы в указатель функции или должны быть переданы в объект.
Наборы перегрузки должны быть преобразованы, поскольку только имя функции обозначает полный набор функций, но вы должны отправить только одну из них. То, как компилятор выберет правильный, зависит от аргументов, которые вы ему отправили. Вызов его предоставляет тип параметров, но преобразование в указатель функции также предоставляет компилятору достаточно информации о том, какую перегрузку необходимо отправить.
Преобразование в указатель функции обычно является простым способом:
auto function = static_cast<std::size_t(*)(std::size_t)>(calc_something);
std::future<std::size_t> async_calc = std::async(function, 5);
Подъем выполняется с помощью лямбды:
std::future<std::size_t> async_calc = std::async([](auto lim) { return calc_something(lim); }, 5);
Подъем здесь возможен, так как вы вызываете набор перегрузки, поэтому есть параметр, который может выбрать компилятор.
Это просто не может отложить это решение для наборов перегрузки, но для лямбда-функции и функции шаблона это может.