unique_ptr 到 nullptr 是不可复制的

unique_ptr to nullptr is uncopyable

创建 unique_ptr 的嵌套向量似乎会抛出 试图引用已删除的函数 。我相信这是因为它试图复制向量 unique_ptr(nullptr),而 unique_ptr(nullptr) 是不可复制的。

#include <memory>
#include <vector>
struct Foo {
};
int main() {
    std::vector<std::vector<std::unique_ptr<Foo>>> foo(5, std::vector<std::unique_ptr<Foo>>(5));
}

https://onlinegdb.com/SkvGkVYoQ

我不确定如何进行。我只需要一个 nullptr 的多维数组,如果它们是唯一的,它会膨胀 - shared_ptr 除了解决这个问题外不需要。

std::unique_ptr 根本不可复制。这与 nullptr 无关。最简单的解决方法是只使用一维数组并映射维度。

然后你可以这样做:

for (std::size_t j = 0; i < 5; ++j) {
    for (std::size_t i = 0; i < 5; ++i) {
        std::size_t index = j*5+i;
        foo.emplace_back(std::make_unique<Foo>());
    }
}

(您可以对嵌套 std::vector 应用类似的模式,但这种方式在缓存位置等方面可能更好)

如果由于向量中每个嵌套向量元素的大小不同而需要嵌套多个向量,则可以使用 std::move 将唯一指针从一个向量移动到另一个向量。

    std::vector<std::unique_ptr<Foo>> container1;
    std::vector<std::unique_ptr<Foo>> container2;
    for (int i = 0; i < 10; ++i)
    {
        container1.emplace_back(std::make_unique<Foo>());
    }

    for (int i = 0; i < 2; ++i)
    {
        container2.emplace_back(std::make_unique<Foo>());
    }

    std::vector<std::vector<std::unique_ptr<Foo>>> containers;
    containers.emplace_back(std::move(container1));
    containers.emplace_back(std::move(container2));

    return 0;

虽然映射是最快的解决方案。