我正在尝试使用std :: vector构造函数的“填充”版本。它将元素数作为第一个参数,并将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_ptr(const std :: 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
答案 0 :(得分:5)
您尝试使用的std::vector
构造函数必须复制提供的输入值,以便将向量填充到请求的大小。无法复制std::unique_ptr
是其最重要的功能之一,因此对于您的代码无法正常工作,您不会感到惊讶。
如果删除第二个参数,则将使用std::unique_ptr
的默认构造函数构造向量中的每个值;因此不进行复制。无论如何,这就是您要尝试的事情。
另请参阅:How to initialize a vector of unique_ptr with null pointers?