Мне было интересно об этом. Рассмотрим это:Можно ли инициализировать контейнер STL с уникальным_ptr из списка инициализаторов?
#include <iostream>
#include <map>
#include <memory>
int main() {
std::map< int, std::unique_ptr<int> > m =
{ { 1, std::unique_ptr<int>(new int(3)) } };
return(0);
}
Это C++ 11. Он не может скомпилировать с длинной пачке сообщений об ошибках на НКУ, в том числе один
/usr/include/c++/4.9/ext/new_allocator.h:120:4: error: use of deleted function ‘constexpr std::pair<_T1, _T2>::pair(const std::pair<_T1, _T2>&) [with _T1 = const int; _T2 = std::unique_ptr<int>]’ { ::new((void *)__p) _Up(std::forward<_Args>(__args)...); }
возможно ли это вообще делать то, что я пытаюсь сделать здесь? Я отмечаю, что с shared_ptr он работает нормально. Можно ли это сделать с помощью unique_ptr? Если да, то что мне не хватает? Если нет, почему бы и нет?
Ах, спасибо. Я подозревал, что что-то вроде этого происходит - «constexpr» выглядел как подсказка. –
@ mike4ty4 Настоящий ключ там, свидетельствующий о том, что сказал Маршалл, - «использование удаленной функции [...] pair (const std :: pair <_T1, _T2> &) [с _T1 = const int; _T2 = std :: unique_ptr] '. То есть: это терпит неудачу, потому что это конструктор копирования, который попытается скопировать оба элемента, но, конечно, 'std :: unique_ptr' не копируется. Конструктор перемещения даст вам ту же ошибку, если вам удалось вызвать это –