https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87658
Bug ID: 87658 Summary: Cannot use move ctor when inserting to std::map Product: gcc Version: 6.4.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: filip.gawin at zoho dot com Target Milestone: --- Problem is caused by this commit: https://github.com/rwengine/openrw/commit/63ab663ea5f2282adfc574a3a537fbf0ec16d8bc#diff-a996c0379ea38c4fa42528c76c60ec03R864 It works with newer version of gcc(7/8) or msvc or clang. Structure `Part` contains unique ptrs, so I've only defined move ctor and move assignment operator (using `= default`). If I change: ``` dynamicParts.insert({mf->getName(), {mf, normal, damage, nullptr, nullptr, nullptr, false, 0.f, 0.f, 0.f}}); std::move(part)}); ``` to `dynamicParts[mf->getName()] = std::move(part);` I'm getting: ``` In file included from /usr/lib/gcc/x86_64-pc-linux-gnu/6.4.1/include/c++/functional:55:0, from /usr/lib/gcc/x86_64-pc-linux-gnu/6.4.1/include/c++/memory:79, from /run/media/filip/Zewn/openrw/shfil/rwengine/src/objects/VehicleObject.hpp:6, from /run/media/filip/Zewn/openrw/shfil/rwengine/src/objects/VehicleObject.cpp:1: /usr/lib/gcc/x86_64-pc-linux-gnu/6.4.1/include/c++/tuple: In instantiation of ‘std::pair<_T1, _T2>::pair(std::tuple<_Args1 ...>&, std::tuple<_Args2 ...>&, std::_Index_tuple<_Indexes1 ...>, std::_Index_tuple<_Indexes2 ...>) [with _Args1 = {const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&}; long unsigned int ..._Indexes1 = {0ul}; _Args2 = {}; long unsigned int ..._Indexes2 = {}; _T1 = const std::__cxx11::basic_string<char>; _T2 = VehicleObject::Part]’: /usr/lib/gcc/x86_64-pc-linux-gnu/6.4.1/include/c++/tuple:1579:63: required from ‘std::pair<_T1, _T2>::pair(std::piecewise_construct_t, std::tuple<_Args1 ...>, std::tuple<_Args2 ...>) [with _Args1 = {const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&}; _Args2 = {}; _T1 = const std::__cxx11::basic_string<char>; _T2 = VehicleObject::Part]’ /usr/lib/gcc/x86_64-pc-linux-gnu/6.4.1/include/c++/ext/new_allocator.h:120:4: required from ‘void __gnu_cxx::new_allocator<_Tp>::construct(_Up*, _Args&& ...) [with _Up = std::pair<const std::__cxx11::basic_string<char>, VehicleObject::Part>; _Args = {const std::piecewise_construct_t&, std::tuple<const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&>, std::tuple<>}; _Tp = std::pair<const std::__cxx11::basic_string<char>, VehicleObject::Part>]’ /usr/lib/gcc/x86_64-pc-linux-gnu/6.4.1/include/c++/bits/alloc_traits.h:475:4: required from ‘static void std::allocator_traits<std::allocator<_Tp1> >::construct(std::allocator_traits<std::allocator<_Tp1> >::allocator_type&, _Up*, _Args&& ...) [with _Up = std::pair<const std::__cxx11::basic_string<char>, VehicleObject::Part>; _Args = {const std::piecewise_construct_t&, std::tuple<const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&>, std::tuple<>}; _Tp = std::pair<const std::__cxx11::basic_string<char>, VehicleObject::Part>; std::allocator_traits<std::allocator<_Tp1> >::allocator_type = std::allocator<std::pair<const std::__cxx11::basic_string<char>, VehicleObject::Part> >]’ /usr/lib/gcc/x86_64-pc-linux-gnu/6.4.1/include/c++/bits/hashtable_policy.h:1953:37: required from ‘std::__detail::_Hashtable_alloc<_NodeAlloc>::__node_type* std::__detail::_Hashtable_alloc<_NodeAlloc>::_M_allocate_node(_Args&& ...) [with _Args = {const std::piecewise_construct_t&, std::tuple<const std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&>, std::tuple<>}; _NodeAlloc = std::allocator<std::__detail::_Hash_node<std::pair<const std::__cxx11::basic_string<char>, VehicleObject::Part>, true> >; std::__detail::_Hashtable_alloc<_NodeAlloc>::__node_type = std::__detail::_Hash_node<std::pair<const std::__cxx11::basic_string<char>, VehicleObject::Part>, true>]’ /usr/lib/gcc/x86_64-pc-linux-gnu/6.4.1/include/c++/bits/hashtable_policy.h:595:8: required from ‘std::__detail::_Map_base<_Key, _Pair, _Alloc, std::__detail::_Select1st, _Equal, _H1, _H2, _Hash, _RehashPolicy, _Traits, true>::mapped_type& std::__detail::_Map_base<_Key, _Pair, _Alloc, std::__detail::_Select1st, _Equal, _H1, _H2, _Hash, _RehashPolicy, _Traits, true>::operator[](const key_type&) [with _Key = std::__cxx11::basic_string<char>; _Pair = std::pair<const std::__cxx11::basic_string<char>, VehicleObject::Part>; _Alloc = std::allocator<std::pair<const std::__cxx11::basic_string<char>, VehicleObject::Part> >; _Equal = std::equal_to<std::__cxx11::basic_string<char> >; _H1 = std::hash<std::__cxx11::basic_string<char> >; _H2 = std::__detail::_Mod_range_hashing; _Hash = std::__detail::_Default_ranged_hash; _RehashPolicy = std::__detail::_Prime_rehash_policy; _Traits = std::__detail::_Hashtable_traits<true, false, true>; std::__detail::_Map_base<_Key, _Pair, _Alloc, std::__detail::_Select1st, _Equal, _H1, _H2, _Hash, _RehashPolicy, _Traits, true>::mapped_type = VehicleObject::Part; std::__detail::_Map_base<_Key, _Pair, _Alloc, std::__detail::_Select1st, _Equal, _H1, _H2, _Hash, _RehashPolicy, _Traits, true>::key_type = std::__cxx11::basic_string<char>]’ /usr/lib/gcc/x86_64-pc-linux-gnu/6.4.1/include/c++/bits/unordered_map.h:904:20: required from ‘std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::mapped_type& std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::operator[](const key_type&) [with _Key = std::__cxx11::basic_string<char>; _Tp = VehicleObject::Part; _Hash = std::hash<std::__cxx11::basic_string<char> >; _Pred = std::equal_to<std::__cxx11::basic_string<char> >; _Alloc = std::allocator<std::pair<const std::__cxx11::basic_string<char>, VehicleObject::Part> >; std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::mapped_type = VehicleObject::Part; std::unordered_map<_Key, _Tp, _Hash, _Pred, _Alloc>::key_type = std::__cxx11::basic_string<char>]’ /run/media/filip/Zewn/openrw/shfil/rwengine/src/objects/VehicleObject.cpp:885:31: required from here /usr/lib/gcc/x86_64-pc-linux-gnu/6.4.1/include/c++/tuple:1590:70: error: no matching function for call to ‘VehicleObject::Part::Part()’ second(std::forward<_Args2>(std::get<_Indexes2>(__tuple2))...) ^ In file included from /run/media/filip/Zewn/openrw/shfil/rwengine/src/objects/VehicleObject.cpp:1:0: /run/media/filip/Zewn/openrw/shfil/rwengine/src/objects/VehicleObject.hpp:83:9: note: candidate: VehicleObject::Part::Part(VehicleObject::Part&&) Part(Part&& part) = default; ^~~~ /run/media/filip/Zewn/openrw/shfil/rwengine/src/objects/VehicleObject.hpp:83:9: note: candidate expects 1 argument, 0 provided /run/media/filip/Zewn/openrw/shfil/rwengine/src/objects/VehicleObject.hpp:65:9: note: candidate: VehicleObject::Part::Part(ModelFrame*, Atomic*, Atomic*, std::unique_ptr<btCollisionShape>, std::unique_ptr<btRigidBody>, std::unique_ptr<btHingeConstraint>, bool, float, float, float) Part(ModelFrame* p_dummy, Atomic* p_normal, Atomic* p_damaged, ^~~~ /run/media/filip/Zewn/openrw/shfil/rwengine/src/objects/VehicleObject.hpp:65:9: note: candidate expects 10 arguments, 0 provided ```