在 vector 的声明中移动 unique_ptr
Moving unique_ptr in the declaration of a vector
我尝试在向量声明期间移动一些 unique_ptr,但出现错误。我想我是在不知情的情况下复制的。
我不明白为什么在 push_back 期间它工作得很好,但我在声明中遇到了问题。
我用几行简化了问题。
#include <iostream>
#include <vector>
#include <memory>
using namespace std;
int main() {
unique_ptr<int> i1 = make_unique<int>(142);
unique_ptr<int> i2 = make_unique<int>(242);
unique_ptr<int> i3 = make_unique<int>(342);
vector<unique_ptr<int>> v;
//Those lines work
v.push_back(move(i1));
v.push_back(move(i2));
v.push_back(move(i3));
//ERROR
vector<unique_ptr<int>> 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<int>]'
{ ::new(static_cast<void*>(__p)) _T1(std::forward<_Args>(__args)...); }
我错过了什么?
谢谢!
当你这样做时
vector<unique_ptr<int>> v2 {move(i1), move(i2), move(i3)};
您实际上并没有直接移动到向量 v2
中。相反,编译器将创建一个 std::initializer_list
of the moved unique pointers, and pass that list object to the std::vector
constructor,然后它将尝试 复制 初始化列表中的元素。
不幸的是,我知道没有办法解决这个问题,即使用中间初始化列表来初始化一个唯一指针向量。
行
vector<unique_ptr<int>> v2 {move(i1), move(i2), move(i3)};
创建一个 std::initializer_list
,它仅通过 reference-to-const 提供对其成员的访问。这个 initializer_list
是通过从每个 unique_ptr
移动来构造的,但是向量然后通过复制 initializer_list
中的元素来初始化。就是这个拷贝导致了你的编译错误。
我尝试在向量声明期间移动一些 unique_ptr,但出现错误。我想我是在不知情的情况下复制的。
我不明白为什么在 push_back 期间它工作得很好,但我在声明中遇到了问题。
我用几行简化了问题。
#include <iostream>
#include <vector>
#include <memory>
using namespace std;
int main() {
unique_ptr<int> i1 = make_unique<int>(142);
unique_ptr<int> i2 = make_unique<int>(242);
unique_ptr<int> i3 = make_unique<int>(342);
vector<unique_ptr<int>> v;
//Those lines work
v.push_back(move(i1));
v.push_back(move(i2));
v.push_back(move(i3));
//ERROR
vector<unique_ptr<int>> 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<int>]'
{ ::new(static_cast<void*>(__p)) _T1(std::forward<_Args>(__args)...); }
我错过了什么?
谢谢!
当你这样做时
vector<unique_ptr<int>> v2 {move(i1), move(i2), move(i3)};
您实际上并没有直接移动到向量 v2
中。相反,编译器将创建一个 std::initializer_list
of the moved unique pointers, and pass that list object to the std::vector
constructor,然后它将尝试 复制 初始化列表中的元素。
不幸的是,我知道没有办法解决这个问题,即使用中间初始化列表来初始化一个唯一指针向量。
行
vector<unique_ptr<int>> v2 {move(i1), move(i2), move(i3)};
创建一个 std::initializer_list
,它仅通过 reference-to-const 提供对其成员的访问。这个 initializer_list
是通过从每个 unique_ptr
移动来构造的,但是向量然后通过复制 initializer_list
中的元素来初始化。就是这个拷贝导致了你的编译错误。