我可以创建一个 unique_ptr<T[]>(n) 的数组,n 在运行时声明,而不循环元素吗?

Can I create an array of unique_ptr<T[]>(n), n declared at runtime, without looping on the elements?

我想填充如下所示的结构:

unique_ptr<int[]> myArray[10];

每个 unique_ptr 都是一个大小为 n 的数组,在运行时定义但保持不变。

有没有办法在 myArray 的声明中初始化所有内容?或者至少不必明确地遍历 myArray 中的每个 unique_ptr

因为目前我找到的最简单的解决方案是添加:

for(auto & it : myArray)
    it.reset(new int[n]);

但感觉就像对 C++ 进行了所有这些很酷的改进,将有一种更简单的方法来初始化一个包含 10 个恒定大小数组的数组 n

我试过类似的方法:

generate_n(std::begin(myArray), 10, []{ return std::unique_ptr<int[]>(new int[n]); });

但是我收到有关隐式捕获 n 的错误。我不知道那是什么意思...

您正在使用指向原始数组的智能指针的原始数组,这不是 C++ 惯用的。恕我直言,std::array<std::vector<int>, 10> MyArray; 以后会更容易使用。无论如何,错误消息很容易解释:您在 lambda 函数中使用了 n 变量,但没有捕获它。编译器只需要:

generate_n(std::begin(myArray), 10, [n]{ return std::unique_ptr<int[]>(new int[n]); });

事实上,生成unque_ptr的正确方法是通过make_unique,所以上面的行应该重写为(感谢BenVoigt的注意):

generate_n(std::begin(myArray), 10, [n]{ return make_unique<int[]>(n); });