我与std::async
实验和结束了,看起来像一个代码:的std ::异步和对象复制
class obj {
public:
int val;
obj(int a) : val(a) {
cout << "new obj" << endl;
}
~obj() {
cout << "delete obj" << endl;
}
};
void foo(obj a) {
this_thread::sleep_for(chrono::milliseconds(500));
cout << a.val << endl;
}
int main(int argc, int **args) {
obj a(5);
auto future = async(foo, a);
future.wait();
return 0;
}
,其结果是:
new obj
delete obj
delete obj
delete obj
5
delete obj
delete obj
delete obj
然后我试图改变void foo(obj a)
通过void foo(obj &a)
:
new obj
delete obj
delete obj
delete obj
5
delete obj
delete obj
我对象的5个人副本为何会为这个简单的代码? 我不得不承认,我真的很困惑。有人会关心解释这一点吗?
编辑
我使用VS2012
尝试进行复制或移动构造'obj'类中的uctor。 – 2013-02-16 15:58:22
虽然他看到复制构造函数的效果,但知道_why_还有5个副本仍然很有趣。遵循代码的我简单的头脑可以看到三个(也许是四个)明显的,但至少有两个并不明显。 – Chad 2013-02-16 16:04:54
在GCC 4.7上使用'const obj&'作为'foo'的参数,我得到3个“delete obj”,这意味着正在创建2个副本。 – mfontanini 2013-02-16 16:23:09