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

时间:2018-08-04 20:09:20

标签: c++ vector unique-ptr

我正在尝试使用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

1 个答案:

答案 0 :(得分:5)

您尝试使用的std::vector构造函数必须复制提供的输入值,以便将向量填充到请求的大小。无法复制std::unique_ptr是其最重要的功能之一,因此对于您的代码无法正常工作,您不会感到惊讶。

如果删除第二个参数,则将使用std::unique_ptr的默认构造函数构造向量中的每个值;因此不进行复制。无论如何,这就是您要尝试的事情。

另请参阅:How to initialize a vector of unique_ptr with null pointers?