为什么我不能将引用作为函数参数传递给 std::async

why cant I pass a reference as a function argument for std::async

我有这个代码。

   int TA11::AsyncRunP(Unit *unit,Function func)
    {
        return 0;
    }
    int TA11::AsyncRunR(Unit& unit, Function func)
    {
        return 0;
    }
    
    void TA11::RunFunc(Unit& unit, Function func)
    {
        assert(!unit.fut_.valid());
    
        unit.fut_ = std::async(std::launch::async, &TA11::AsyncRunR, this, unit, func);
        unit.fut_ = std::async(std::launch::async, &TA11::AsyncRunP, this, &unit, func);
    }

VS2019 c++17模式。 (函数是一个 class 枚举)

第一个 std::async 无法编译,第二个没问题。

1>C:\work\pdp\mysim\mysim\Ta11Cassette.cpp(115,19): error C2672: 'std::async': no matching overloaded function found 1>C:\work\pdp\mysim\mysim\Ta11Cassette.cpp(115,79): error C2893: Failed to specialize function template 'std::future<_Invoke_traits<void,decay<_Ty>::type,decay<_ArgTypes>::type...>::type> std::async(std::launch,_Fty &&,_ArgTypes &&...)' 1>C:\Program Files (x86)\Microsoft Visual Studio19\Community\VC\Tools\MSVC.25.28610\include\future(1481): message : see declaration of 'std::async' 1>C:\work\pdp\mysim\mysim\Ta11Cassette.cpp(115,79): message : With the following template arguments: 1>C:\work\pdp\mysim\mysim\Ta11Cassette.cpp(115,79): message : '_Fty=int (__thiscall TA11::* )(TA11::Unit &,TA11::Function)' 1>C:\work\pdp\mysim\mysim\Ta11Cassette.cpp(115,79): message : '_ArgTypes={TA11 *, TA11::Unit &, TA11::Function &}'

std::async 按值将参数传递给可调用对象(不进行完美转发),因此您收到错误,因为您的可调用对象仅接受引用。

您可以使用 std::ref() 通过引用传递您的变量。