我有一个代码:
class cabc{ public: void pr() { cout<<"abcdef"; } }; int main() { cabc cap; auto f = async(cap.pr); f.get(); return 0; }
此代码无效.我知道可以使用以下方法完成同样的事情:
auto f = async(&cabc::pr,cap);
这很有效.但为什么第一种方法不起作用呢?
cap.pr
是不完整的成员函数调用表达式.您必须使用包含相应函数参数的括号来跟随它,以生成有效的C++表达式.
因此,您无法传递cap.pr
给std::async
任何其他功能.
要将成员函数传递给std::async
您,需要使用您找到的语法:
auto f=std::async(&capc::pr,cap);
虽然在这种情况下,您需要知道该cap
对象已被复制.你也可以用
auto f=std::async(&capc::pr,&cap);
只是传递一个指针cap
.
如果指向成员函数的指针语法不受欢迎,那么你可以使用lambda:
auto f=std::async([&]{cap.pr();});
这不完全相同:它不传递成员函数指针和对象指针std::async
,它传递一个包含cap
对其pr
直接调用其成员函数的引用的lambda对象.但是,结果基本相同.