от unique_ptr до nullptr невозможно скопировать - PullRequest
0 голосов
/ 21 октября 2018

Похоже на создание вложенных векторов 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 не нужен, кроме как для решения этой проблемы.

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

Если вам когда-либо понадобится вложить несколько векторов из-за того, что каждый вложенный векторный элемент в векторе имеет разный размер, вы можете использовать std::move для перемещения уникальных ptrs из одного вектора в другой.

    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;

Картография - самое быстрое решение.

0 голосов
/ 21 октября 2018

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 sно в этом случае, вероятно, все-таки лучше в отношении кеширования и т. д.)

...