我尝试在声明期间在向量中移动一些unique_ptr,我收到错误.我想我在不知情的情况下制作副本.
我不明白为什么我在声明中遇到问题,而在push_back期间它工作得很好.
我用几行简化了问题.
#include#include #include using namespace std; int main() { unique_ptr i1 = make_unique (142); unique_ptr i2 = make_unique (242); unique_ptr i3 = make_unique (342); vector > v; //Those lines work v.push_back(move(i1)); v.push_back(move(i2)); v.push_back(move(i3)); //ERROR vector > v2 {move(i1), move(i2), move(i3)}; return 0; }
错误是:
use of deleted function 'std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = int; _Dp = std::default_delete]' { ::new(static_cast (__p)) _T1(std::forward<_Args>(__args)...); }
我错过了什么?
谢谢 !
当你这样做
vector> v2 {move(i1), move(i2), move(i3)};
你实际上并没有直接进入矢量v2
.相反,编译器将创建一个std::initializer_list
移动的唯一指针,并将该列表对象传递给std::vector
构造函数,然后构造函数将尝试从初始化列表中复制元素.
不幸的是,我知道无法解决问题,使用中间初始化列表来初始化唯一指针的向量.