Проблема в том, что для передачи второго аргумента в std::async
компилятор должен превратить выражение &std::accumulate
в указатель функции, но он не знает, какую специализацию шаблона функции вы хотите. Для человека очевидно, что вы хотите тот, который может быть вызван с остальными аргументами в async
, но компилятор этого не знает и должен оценивать каждый аргумент отдельно.
Как PiotrS. ответ говорит, вы можете сказать компилятору, который std::accumulate
вы хотите, с явным списком аргументов шаблона или с помощью приведения, или, альтернативно, вы можете просто использовать выражение лямбда вместо:
std::async(std::launch::async,[&] { return std::accumulate(v.begin(), v.end(), 0.0); });
Внутри тела lambda компилятор выполняет разрешение перегрузки для вызова std::accumulate
, и поэтому он работает, какой std::accumulate
использовать.