有个项目,简化成下列问题。
#include <iostream>
#include <functional>
using namespace std;
class Test {
public:
Test(int a):a_(a){}
~Test(){}
Test(const Test&) = delete;
Test& operator=(const Test&) = delete;
Test(Test&& o) = default;
Test& operator=(Test&& o) = default;
int value(){ return a_;}
private:
int a_;
};
void Doit(const std::function<Test()>& f){
std::cout<<f().value();
}
int main()
{
cout<<"Hello World"<<endl;
Doit([](){return Test(3);}); //成功
Test t(2);
Doit([tt = std::move(t)](){ return std::move(tt); }); // 无法编译
return 0;
}
main.cpp:36:58: error: use of deleted function ‘Test::Test(const Test&)’
Doit([tt=std::move(t)](){ return std::move(tt); });
当然,如果改成Doit([&](){ return std::move(t); });可以编译,但是我无法用&,因为真正的程序和promise相关,前面定义的变量在执行一个promise之后无法再抓住t,所以我觉得得move。(或者copy,但是这个类不能copy)。
--
FROM 72.199.121.*