我不能将 'fill' std::vector 构造函数与 unique_ptrs 一起使用



我正在尝试使用std::vector构造函数的"fill"版本。它将元素的数量作为第一个参数,并使用const value_type&作为第二个论点:

#include <vector>
int main()
{
std::vector<int> v(100, 7);
// Works, creates vector with 100 elements of int 7.
}

然而,我似乎无法用unique_ptrs:实现这一点

#include <vector>
#include <memory>
int main()
{
std::vector<std::unique_ptr<int>> v1(100, std::unique_ptr<int>());
std::vector<std::unique_ptr<int>> v2(100, std::make_unique<int>());
}

两者都不适用于unique_ptrs。我从Visual Studio 2017中得到的错误是:

错误C2280‘std::unique_ptr>::unique_pr(conststd::unique_ptr&lt_Ty,std::default_delete&lt_Ty>>&(':试图引用已删除的功能

考虑到第二个参数对向量中包含的类型进行了const引用,我希望std::unique_ptr((或std::make_unique((能简单地用作第二个自变量。我知道它们都是临时的,但鉴于参数是const引用,它应该接受它,为什么它接受它的方式接受了整数7作为我的第一个例子中的参数。

此外,std::unique_ptr((看起来非常接近"最麻烦的解析",但cppreference.com上的示例使用了它:

// Use the default constructor.
std::unique_ptr<Vec3> v1 = std::make_unique<Vec3>();

正如我所说,这看起来有点像"最麻烦的解析",是一个不带参数的函数的函数签名,并返回std::unique_ptr<Vec3>

您尝试使用的std::vector构造函数必须复制提供的输入值,以便将矢量填充到请求的大小。不能复制std::unique_ptr是它最重要的特性之一,所以您不应该对代码不起作用感到惊讶。

如果去掉第二个参数,向量中的每个值都将使用std::unique_ptr的默认构造函数构造;因此不进行复制。无论如何,这就是你要做的。

另请参阅:如何使用空指针初始化unique_ptr的向量?

最新更新