为什么我不能将引用作为函数参数传递给 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()
通过引用传递您的变量。
我有这个代码。
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()
通过引用传递您的变量。