Невозможно переместить std :: any - PullRequest
0 голосов
/ 30 мая 2019

Следующий код

using vptr = std::vector<std::unique_ptr<int>>;
auto m = std::unordered_map<int, std::any>{};
m.try_emplace(0, move(vptr{}));

Не компилируется, жалуется на использование конструктора удаленных копий unique_ptr.После замены std::any на vptr в аргументе шаблона этот код компилируется, поэтому проблема явно заключается в any

Как я могу заставить std::any перемещаться вместо копирования?

1 Ответ

5 голосов
/ 30 мая 2019

Проблема не в перемещении std :: any, а в том, что сам std :: any не поддерживает типы только для перемещения (например, std :: unique_ptr)

согласно cppreference

template< class ValueType >
any( ValueType&& value );

Создает объект с начальным содержимым объект типа std::decay_t< ValueType>, с прямой инициализацией из std::forward< ValueType>(value). Если std::is_copy_constructible< std::decay_t< ValueType>>::value равно false, программа некорректна

Вы можете проверить, что is_copy_constructible ... false с static_assert, см. coliru

Самый простой обходной путь, который я могу придумать, - это использовать shared_ptr и при этом вызывать std :: move.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...