首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么‘`std::异步’不能选择正确的重载?

为什么‘`std::异步’不能选择正确的重载?
EN

Stack Overflow用户
提问于 2020-02-03 15:03:55
回答 3查看 437关注 0票数 2

请考虑以下例子:

代码语言:javascript
运行
复制
#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);

的调用没有匹配函数

EN

Stack Overflow用户

发布于 2020-02-03 15:09:04

重载集不能以参数的形式发送,必须首先将其转换为函数指针,或者必须将其提升为对象。

必须转换重载集,因为只有函数的名称表示完整的函数集,但必须只发送其中的一个。编译器如何选择正确的参数取决于您发送给它的参数。调用它提供了参数的类型,但转换为函数指针也为编译器提供了关于必须发送哪种重载的足够信息。

转换为函数指针通常是一种简单的方法:

代码语言:javascript
运行
复制
auto function = static_cast<std::size_t(*)(std::size_t)>(calc_something);
std::future<std::size_t> async_calc = std::async(function, 5);

起重是用灯笼完成的:

代码语言:javascript
运行
复制
std::future<std::size_t> async_calc = std::async([](auto lim) { return calc_something(lim); }, 5);

在这里提升是可能的,因为您调用了重载集,所以编译器可以选择一个参数。

它不能延迟重载集的决定,但对于lambda和template函数则可以。

票数 3
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60041869

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档