我正在尝试使用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<_Ty,std::default_delete<_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的向量?