LINUX.ORG.RU

Инициализация списка unique_ptr<> средствами initializer_list<>

 


0

3

Господа, а расскажите как правильно инициализировать список unique_ptr. Хотелось бы использовать что-то похожее на

std::list<std::unique_ptr<int>>
  ints{std::unique_ptr<int>(new int), std::unique_ptr<int>(new int)};


Последнее исправление: mkam (всего исправлений: 1)

А что так не работает? std::make_unique<int>() безопаснее будет

std::list<std::unique_ptr<int>> ints{std::make_unique<int>(), std::make_unique<int>()};

placement_new ★★
()
Ответ на: комментарий от panter_dsd

Ну да. Но gcc 4.9.1 поддерживает. В крайнем случае, самому можно добавить.

placement_new ★★
()
Последнее исправление: placement_new (всего исправлений: 1)
Ответ на: комментарий от placement_new

clang из транка не осилил такой вариант. Собираю последний gcc, но сомневаюсь, что и он осилит.

mkam
() автор топика
Ответ на: комментарий от mkam

Тебе проще самому написать аналог и обернуть ифдефами на будущее, чтобы юзать стандартную реализацию.

panter_dsd ★★★★
()

Вроде std::initialize_list отдаёт только константные объекты. Это значит, что из него нельзя забрать объект, которым владеет std::unique_ptr. Придумалось нечто похожее, может можно получше синтаксис доделать.

xaizek ★★★★★
()
Ответ на: комментарий от placement_new

std::make_unique<int>() безопаснее будет

С чего бы? std::make_shared добавили из-за того, что реализация создаёт внутренний объект и безопастоить состоит в том, чтобы выделять память под него и используемый тип одновременно. std::unique_ptr ничего подобного не содержит (он вообще почти ничего не содержит) и единственная причина добавления std::make_unique это унификация синтаксиса. Суть от использования std::unique_ptr никак не поменяется, тип выражения будет тот же (std::unique_ptr<int>), никакой магии там нет.

xaizek ★★★★★
()
Ответ на: комментарий от placement_new
mkam@localhost:~/projects$ ~/opt/gcc-4.9.2-release/bin/g++ -std=c++1y -fno-elide-constructors test.cpp 
In file included from /home/mkam/opt/gcc-4.9.2-release/include/c++/4.9.2/list:63:0,
                 from test.cpp:1:
/home/mkam/opt/gcc-4.9.2-release/include/c++/4.9.2/bits/stl_list.h: In instantiation of ‘std::_List_node<_Tp>::_List_node(_Args&& ...) [with _Args = {const std::unique_ptr<int, std::default_delete<int> >&}; _Tp = std::unique_ptr<int>]’:
/home/mkam/opt/gcc-4.9.2-release/include/c++/4.9.2/ext/new_allocator.h:120:4:   required from ‘void __gnu_cxx::new_allocator<_Tp>::construct(_Up*, _Args&& ...) [with _Up = std::_List_node<std::unique_ptr<int> >; _Args = {const std::unique_ptr<int, std::default_delete<int> >&}; _Tp = std::_List_node<std::unique_ptr<int> >]’
/home/mkam/opt/gcc-4.9.2-release/include/c++/4.9.2/bits/stl_list.h:514:8:   required from ‘std::list<_Tp, _Alloc>::_Node* std::list<_Tp, _Alloc>::_M_create_node(_Args&& ...) [with _Args = {const std::unique_ptr<int, std::default_delete<int> >&}; _Tp = std::unique_ptr<int>; _Alloc = std::allocator<std::unique_ptr<int> >; std::list<_Tp, _Alloc>::_Node = std::_List_node<std::unique_ptr<int> >]’
/home/mkam/opt/gcc-4.9.2-release/include/c++/4.9.2/bits/stl_list.h:1688:63:   required from ‘void std::list<_Tp, _Alloc>::_M_insert(std::list<_Tp, _Alloc>::iterator, _Args&& ...) [with _Args = {const std::unique_ptr<int, std::default_delete<int> >&}; _Tp = std::unique_ptr<int>; _Alloc = std::allocator<std::unique_ptr<int> >; std::list<_Tp, _Alloc>::iterator = std::_List_iterator<std::unique_ptr<int> >]’
/home/mkam/opt/gcc-4.9.2-release/include/c++/4.9.2/bits/stl_list.h:1039:11:   required from ‘void std::list<_Tp, _Alloc>::emplace_back(_Args&& ...) [with _Args = {const std::unique_ptr<int, std::default_delete<int> >&}; _Tp = std::unique_ptr<int>; _Alloc = std::allocator<std::unique_ptr<int> >]’
/home/mkam/opt/gcc-4.9.2-release/include/c++/4.9.2/bits/stl_list.h:1618:27:   required from ‘void std::list<_Tp, _Alloc>::_M_initialize_dispatch(_InputIterator, _InputIterator, std::__false_type) [with _InputIterator = const std::unique_ptr<int>*; _Tp = std::unique_ptr<int>; _Alloc = std::allocator<std::unique_ptr<int> >]’
/home/mkam/opt/gcc-4.9.2-release/include/c++/4.9.2/bits/stl_list.h:621:70:   required from ‘std::list<_Tp, _Alloc>::list(std::initializer_list<_Tp>, const allocator_type&) [with _Tp = std::unique_ptr<int>; _Alloc = std::allocator<std::unique_ptr<int> >; std::list<_Tp, _Alloc>::allocator_type = std::allocator<std::unique_ptr<int> >]’
test.cpp:11:112:   required from here
/home/mkam/opt/gcc-4.9.2-release/include/c++/4.9.2/bits/stl_list.h:114:71: error: use of deleted function ‘std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = int; _Dp = std::default_delete<int>]’
  : __detail::_List_node_base(), _M_data(std::forward<_Args>(__args)...) 
                                                                       ^
In file included from /home/mkam/opt/gcc-4.9.2-release/include/c++/4.9.2/memory:81:0,
                 from test.cpp:2:
/home/mkam/opt/gcc-4.9.2-release/include/c++/4.9.2/bits/unique_ptr.h:356:7: note: declared here
       unique_ptr(const unique_ptr&) = delete;
       ^
mkam@localhost:~/projects$ 

Собственно ругань на удалённый копирующий конструктор. Повод покурить Джосаттиса

mkam
() автор топика
Ответ на: комментарий от placement_new

Нет, это ты не про безопасность говоришь, а про оптимизацию.

Да, туплю.

xaizek ★★★★★
()
Ответ на: комментарий от mkam

Да, initializer_list и move-семантика не работает вместе.

http://stackoverflow.com/questions/8193102/initializer-list-and-move-semantics

Получается, что не получается ничего красивого.

placement_new ★★
()
Последнее исправление: placement_new (всего исправлений: 1)
Ответ на: комментарий от placement_new

Беда-печаль какая :(

Всем спасибо.

mkam
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.