请考虑以下例子:
#include <iostream>
#include <future>
std::size_t calc_something(std::size_t lim_)
{
std::size_t result = lim_ * 10;
return result;
}
void calc_something(std::size_t lim_, std::promise<std::size_t> &promise_)
{
std::size_t result = lim_ * 10;
promise_.set_value(result);
}
void async_calc()
{
std::future<std::size_t> async_calc = std::async(calc_something, 5);
std::cout<< "async_calc = " << async_calc.get() <<std::endl;
}我对多线程还不熟悉,但是为什么-on std::async不能选择正确的重载呢?第二个重载使用对std::promise对象的引用。
我看过这个问题,here,但它没有解释为什么。另外,我也不会有歧义错误。
我得到的错误是:
错误:对‘异步’std::future async_calc =std::异步(calc_something,5);
的调用没有匹配函数
发布于 2020-02-03 15:09:04
重载集不能以参数的形式发送,必须首先将其转换为函数指针,或者必须将其提升为对象。
必须转换重载集,因为只有函数的名称表示完整的函数集,但必须只发送其中的一个。编译器如何选择正确的参数取决于您发送给它的参数。调用它提供了参数的类型,但转换为函数指针也为编译器提供了关于必须发送哪种重载的足够信息。
转换为函数指针通常是一种简单的方法:
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);在这里提升是可能的,因为您调用了重载集,所以编译器可以选择一个参数。
它不能延迟重载集的决定,但对于lambda和template函数则可以。
https://stackoverflow.com/questions/60041869
复制相似问题