c++11多线程使用类的问题

两个问题。。。classA{....inta;voidfun(){...}}Af;std::threadt1(std::mem_fn(&A::fun),&f);//#1s... 两个问题。。。

class A{
....
int a;
void fun(){...}
}

A f;
std::thread t1(std::mem_fn(& A::fun),&f); // #1
std::thread t1(std::mem_fn(& A::fun), f); // #2

第一个问题, A::fun 之前的& 为什么需要? fun是个函数那么没有&不是一样传递地址吗....
第二个问题,f之前加了&和不加都可以运行.... thread是不是重载了thread()让他既可以接受指针也可以值传递?还是说使用了<template>

谢谢
展开
 我来答
zjfaok
推荐于2016-01-18 · TA获得超过6806个赞
知道大有可为答主
回答量:4146
采纳率:62%
帮助的人:1616万
展开全部
  1. fun不是函数,是“成员函数”,准确地说,是“非静态成员函数”,“非静态成员函数”和“函数”的使用方法完全不同

  2. 这里是 std::mem_fn 的功劳,std::mem_fn(& A::fun) 返回的可调用对象可以接受 A 类的对象作为参数,也可以接受 A* 类的指针作为参数

不过 std::thread 确实也有相关的(复杂)处理,使得

std::thread t1(& A::fun,&f); // #3
std::thread t1(& A::fun, f); // #4

也都是合法的。

追问
1.能不能稍微再详细一点.... 成员函数的地址跟一般函数有什么不一样... 谢谢
追答

成员函数跟一般函数完全不一样


成员函数指针跟一般的函数指针也完全不一样,不论是类型还是使用方式,在大多数编译器上甚至连 sizeof 的结果都不一样


真要具体说的话

class A{
public:
    void fun();
};

void f();
void g(const A& ap);
auto p1 = &A::fun; // p1的类型是 void A::* ()
auto p2 = &f;      // p2的类型是 void ()
auto p3 = &g;      // p3的类型是 void (const A&)
// 以上是类型的不同

A aa;
(aa.*p1)(); // 调用p1,括号不能省
p2();
p3(aa);
// 以上是使用方式的不同

std::cout<<sizeof(p1)<<' '<<sizeof(p2)<<' '<<sizeof(p3);
// 在某个平台上输出 16 8 8

显然,看起来就完全不同

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式