当包含std :: promise作为成员时,为什么struct的make_unique失败?

时间:2016-12-16 15:49:53

标签: c++ c++14 unique-ptr

我编写了结构int,以便它可以使用任意数量的参数进行实例化,在这种情况下,参数是boolMyParams。出于封装原因,我希望promise包含自己的#include <tuple> #include <memory> #include <future> //std::promise< bool > donePromise; // OK: if at global level, then make_unique error goes away template< typename... ArgsT > struct MyParams { MyParams( ArgsT... args ) : rvalRefs { std::forward_as_tuple( args... ) } {} std::tuple< ArgsT... > rvalRefs; std::promise< bool > donePromise; // causes make_unique to fail when donePromise is a member of MyParams }; int main() { int num { 33 }; bool tf { false }; MyParams< int, bool > myParams( num, tf ); // OK auto myParamsUniquePtr = std::make_unique< MyParams< int, bool > >( myParams ); std::future< bool > doneFuture = myParams.donePromise.get_future(); // OK: when donePromise is a global return 0; } ,以便它可以在完成某些操作时进行报告。但是当我向结构添加语句时,它失败了。但作为一个全球性的,它运作良好。这是代码:

error C2280: 'MyParams<int,bool>::MyParams(const MyParams<int,bool> &)': attempting to reference a deleted function
promise

关于作为会员的{{1}}声明,我缺少什么?

1 个答案:

答案 0 :(得分:2)

std::promise不是可复制构造的。

std::make_unique< MyParams< int, bool > >( myParams )

上面,make_unique正在尝试复制由于MyParams< int, bool >数据成员的存在而构造错误的promise构造。如果移动构造,则可以获取要编译的代码。

std::make_unique< MyParams< int, bool > >( std::move(myParams) )