我有一个简单的函数,它应该构造一些对象并返回它们的向量同时转移所有权。我认为最好的方法是返回对象的 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;
}
为什么第二种解决方案可行而第一种不可行?有没有解决方法可以让我在使用初始化列表的短而简单语法的情况下使用?
int
(因为很少有指向单个int
值的指针是有意义的),而是建议您创建一个简单的类或结构来使用。它不必完全定义,因为这与问题无关,但至少会更有意义。例如,可以使用虚拟的Foo
替代int
。 - Some programmer dude