这个问题(下面的代码)std::async 和对象复制让我想到了复制/移动重型库实现。例如,这个制作 5 个副本。对策可能很棘手,例如在异步情况下,通过引用而不是值传递可能会导致并发问题。移动构造函数也不总是便宜的。
我的问题是,像找到一种通过引用传递的方法这样的对策真的可以解决一个不存在的问题吗?我假设大多数(如果不是全部)库函数最终都会被内联,它们通常只有一两行代码。我当然仍然会在输出中得到五个“删除 obj”,因为编译器必须遵循 as if 规则。如果我要通过不打印来消除析构函数的副作用,那么好像规则会更进一步并最终在发布版本中只有一个副本/移动吗?
在编写移动构造函数时我应该注意哪些事情,以免混淆编译器或无意引入副作用并阻止它进行优化?
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;
}