Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 与成员函数异步_C++_C++11_Asynchronous - Fatal编程技术网

C++ 与成员函数异步

C++ 与成员函数异步,c++,c++11,asynchronous,C++,C++11,Asynchronous,我有一个密码: class cabc{ public: void pr() { cout<<"abcdef"; } }; int main() { cabc cap; auto f = async(cap.pr); f.get(); return 0; } 这是有效的。但是为什么第一种方法不起作用呢?请查看async的函数签名: template< class Function, class... Ar

我有一个密码:

class cabc{
public:
    void pr()
    {
        cout<<"abcdef";
    }
};
int main()
{

    cabc cap;
    auto f = async(cap.pr);
    f.get();
    return 0;
}

这是有效的。但是为什么第一种方法不起作用呢?

请查看
async
的函数签名:

template< class Function, class... Args>
std::future<typename std::result_of<Function(Args...)>::type>
    async( Function&& f, Args&&... args );
模板<类函数,类。。。Args>
未来
异步(函数和函数、参数和…参数);
(来自)

显然,首先,无论
函数&&
是什么,都不可能
cap.pr
&cabc::pr
都是这种类型

更准确地说,
函数&
应该是对函数指针的右值引用
&cabc::pr
只是指向成员函数的指针的语法,因为它是成员函数,所以指向对象本身的指针必须是第一个参数。如果
cap.pr
是一个C风格的函数指针,那么您的第一个示例可能会起作用

老实说,我不确定第二个示例为什么有效,因为您没有传递指向对象的指针


类似的问题还有很多其他答案。例如:

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
的引用的lambda对象,该对象直接调用其
pr
成员函数。但是,结果基本上是一样的。

为什么您希望第一种方法可以工作?这不仅仅是
async
,而是语言的工作方式(或不工作)。cap.pr的功能与常规方法类似。那为什么它不应该起作用呢@juanchopanzaNo,
cap.pr
不是一个函数
cap.pr(arg)
的意思是“调用
cabc::pr
on
cap
并带有参数
arg
”<代码> CAP.PR/<代码>本身没有意义。C++中应该有一个核心语言中的“绑定成员函数指针”的概念,因为很多人都直觉地认为你想使用的语法应该工作。然而,事实并非如此,将特性添加到现有类型系统并不是一件小事。另一方面,在库级很容易模拟它——它被称为
std::mem\u fn
,它被
std::async
内部使用,以使
async(&a::b,c)
语法工作。很好——我没有想到在那里使用lambda。
auto f=std::async([&]{cap.pr();});