Не можете использовать unique_ptr внутри карты в векторе? - PullRequest
0 голосов
/ 13 февраля 2020

Я хотел бы использовать unique_ptr внутри map в vector. Но я получил сообщение об ошибке. Я не уверен, почему и как решить эту проблему.
Это код.

#include <memory>

int main(int argc, char** argv)
{
    std::vector<std::map<int, std::unique_ptr<std::string>>> outputContainers;
    std::map<int, std::unique_ptr<std::string>> outputContainer;
    outputContainer[0] = std::make_unique<std::string>("test");
    outputContainers.push_back(std::move(outputContainer));
}

Это сообщение об ошибке.

Error C2280 'std::pair<const int,std::unique_ptr<std::string,std::default_delete<std::string>>>::pair(const std::pair<const int,std::unique_ptr<std::string,std::default_delete<std::string>>> &)': attempting to reference a deleted function test C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.24.28314\include\xmemory  671 

1 Ответ

1 голос
/ 15 февраля 2020

Когда вектор должен перераспределиться, он может переместить элементы в новое хранилище, если тип элемента is_nothrow_move_constructible; в противном случае он должен копировать (чтобы он мог вернуться к исходному состоянию, если какой-либо конструктор выдает исключение).

std::map Конструктор перемещения не обязательно должен быть noexcept. Некоторые реализации могут предоставить более строгие гарантии, чем требуется стандартом, и сделать его noexcept; другие не могут.

Взаимодействие этих двух фактов приводит к непереносимости вектора карт типа «только для перемещения» - он может компилироваться с некоторыми реализациями, но не с другими.

...