【发布时间】:2019-07-09 15:19:00
【问题描述】:
我有一个简单的函数,它应该构造一些对象并返回它们的向量,同时还转移所有权。我认为最好的方法是简单地返回对象的std::vector<std::unique_ptr<int>>(假设它们是int)。
当我尝试以下功能时:
std::vector<std::unique_ptr<int>> create_stuff() {
auto first = std::make_unique<int>(1);
auto second = std::make_unique<int>(2);
return {std::move(first), std::move(second)};
}
我收到了一个非常长的编译错误,结尾是:
xmemory0(737): error C2280: 'std::unique_ptr<int,std::default_delete<_Ty>>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)':
attempting to reference a deleted function
我认为问题出在函数本身,但是以下解决方案效果很好:
std::vector<std::unique_ptr<int>> create_stuff() {
auto first = std::make_unique<int>(1);
auto second = std::make_unique<int>(2);
std::vector<std::unique_ptr<int>> results;
results.push_back(std::move(first));
results.push_back(std::move(second));
return results;
}
为什么第二个解决方案有效,但第一个无效?有没有一种解决方法可以让我在初始化列表中使用简短的语法?
【问题讨论】:
-
因为初始值设定项列表被传递,然后您将其元素复制到向量中,所以您不会移动它们 AFAIK。
-
而不是在你的例子中使用
int(因为指向单个int值的指针很少有意义),我建议你创建一个简单的类或结构来使用。它不必完全定义,因为这与问题无关,但至少它会更有意义。例如使用虚拟Foo而不是int。
标签: c++ unique-ptr initializer-list