我不能将 'fill' std::vector 构造函数与 unique_ptrs 一起使用
I can't use 'fill' std::vector constructor with unique_ptrs
我正在尝试使用 "fill" 版本的 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 得到的错误是:
Error C2280 'std::unique_ptr>::unique_ptr(const
std::unique_ptr<_Ty,std::default_delete<_Ty>> &)': attempting to
reference a deleted function
考虑到第二个参数采用对向量中包含的类型的 const 引用,我希望 std::unique_ptr() 或 std::make_unique() 可以简单地用作第二个参数。我知道它们都是临时变量,但鉴于参数是 const 引用,它应该接受它,为什么它接受它的方式在我的第一个有效示例中接受整数 7 作为参数。
此外,std::unique_ptr() 看起来非常接近 "most vexing parse",但是 cppreference.com 中的示例使用它:
// Use the default constructor.
std::unique_ptr<Vec3> v1 = std::make_unique<Vec3>();
正如我所说,这看起来像 "most vexing parse",是一个不带参数的函数的函数签名,并且 returns a std::unique_ptr< Vec3 >
您尝试使用的 std::vector
构造函数必须 复制 提供的输入值,以便将向量填充到请求的大小。无法复制 std::unique_ptr
是它最重要的特性之一,因此您不应该对您的代码不起作用感到惊讶。
如果删除第二个参数,向量中的每个值都将使用 std::unique_ptr
的默认构造函数构造;因此不复制。无论如何,这就是您要尝试做的事情。
另请参阅:
我正在尝试使用 "fill" 版本的 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 得到的错误是:
Error C2280 'std::unique_ptr>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)': attempting to reference a deleted function
考虑到第二个参数采用对向量中包含的类型的 const 引用,我希望 std::unique_ptr() 或 std::make_unique() 可以简单地用作第二个参数。我知道它们都是临时变量,但鉴于参数是 const 引用,它应该接受它,为什么它接受它的方式在我的第一个有效示例中接受整数 7 作为参数。
此外,std::unique_ptr() 看起来非常接近 "most vexing parse",但是 cppreference.com 中的示例使用它:
// Use the default constructor.
std::unique_ptr<Vec3> v1 = std::make_unique<Vec3>();
正如我所说,这看起来像 "most vexing parse",是一个不带参数的函数的函数签名,并且 returns a std::unique_ptr< Vec3 >
您尝试使用的 std::vector
构造函数必须 复制 提供的输入值,以便将向量填充到请求的大小。无法复制 std::unique_ptr
是它最重要的特性之一,因此您不应该对您的代码不起作用感到惊讶。
如果删除第二个参数,向量中的每个值都将使用 std::unique_ptr
的默认构造函数构造;因此不复制。无论如何,这就是您要尝试做的事情。
另请参阅: