MSVC ++ map <int, list <unique_ptr <test> >> does not compile remote function reference
#include <iostream>
#include <memory>
#include <list>
#include <map>
using namespace std;
struct test {
test(const test&) = delete;
test& operator = (const test&) = delete;
test() = default;
~test() = default;
};
typedef unique_ptr<test> test_ptr;
int main() {
list<test_ptr> test_ptr_list; //This is line 17, where the error occurs
// comment out next line and it compiles on VC++.
map<int, list<test_ptr>> test_ptr_map; //error occurs if this is not commented
return 0;
}
This code compiles to ideone C++11
, but fails at MSVC++ 2013 CTP Nov 2013
. I'm pretty sure this should compile, as it unique_ptr
can move even though my wrapped object can't copy. Works fine with list
, not with map
.
Is this a bug MSVC++
or am I doing something wrong?
Error message:
1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\xmemory0(600): error C2280: 'std::unique_ptr<test,std::default_delete<_Ty>>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)' : attempting to reference a deleted function
1> with
1> [
1> _Ty=test
1> ]
1> c:\program files (x86)\microsoft visual studio 12.0\vc\include\memory(1486) : see declaration of 'std::unique_ptr<test,std::default_delete<_Ty>>::unique_ptr'
1> with
1> [
1> _Ty=test
1> ]
1> c:\program files (x86)\microsoft visual studio 12.0\vc\include\xmemory0(723) : see reference to function template instantiation 'void std::allocator<_Other>::construct<_Objty,const std::unique_ptr<test,std::default_delete<_Ty>>&>(_Objty *,const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)' being compiled
1> with
1> [
1> _Other=std::_List_node<std::unique_ptr<test,std::default_delete<test>>,void *>
1> , _Objty=std::unique_ptr<test,std::default_delete<test>>
1> , _Ty=test
1> ]
1> c:\program files (x86)\microsoft visual studio 12.0\vc\include\xmemory0(723) : see reference to function template instantiation 'void std::allocator<_Other>::construct<_Objty,const std::unique_ptr<test,std::default_delete<_Ty>>&>(_Objty *,const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)' being compiled
1> with
1> [
1> _Other=std::_List_node<std::unique_ptr<test,std::default_delete<test>>,void *>
1> , _Objty=std::unique_ptr<test,std::default_delete<test>>
1> , _Ty=test
1> ]
1> c:\program files (x86)\microsoft visual studio 12.0\vc\include\xmemory0(872) : see reference to function template instantiation 'void std::allocator_traits<_Alloc>::construct<_Ty,const std::unique_ptr<test,std::default_delete<test>>&>(std::allocator<_Other> &,_Objty *,const std::unique_ptr<test,std::default_delete<test>> &)' being compiled
1> with
1> [
1> _Alloc=std::allocator<std::_List_node<std::unique_ptr<test,std::default_delete<test>>,void *>>
1> , _Ty=std::unique_ptr<test,std::default_delete<test>>
1> , _Other=std::_List_node<std::unique_ptr<test,std::default_delete<test>>,void *>
1> , _Objty=std::unique_ptr<test,std::default_delete<test>>
1> ]
1> c:\program files (x86)\microsoft visual studio 12.0\vc\include\xmemory0(872) : see reference to function template instantiation 'void std::allocator_traits<_Alloc>::construct<_Ty,const std::unique_ptr<test,std::default_delete<test>>&>(std::allocator<_Other> &,_Objty *,const std::unique_ptr<test,std::default_delete<test>> &)' being compiled
1> with
1> [
1> _Alloc=std::allocator<std::_List_node<std::unique_ptr<test,std::default_delete<test>>,void *>>
1> , _Ty=std::unique_ptr<test,std::default_delete<test>>
1> , _Other=std::_List_node<std::unique_ptr<test,std::default_delete<test>>,void *>
1> , _Objty=std::unique_ptr<test,std::default_delete<test>>
1> ]
1> c:\program files (x86)\microsoft visual studio 12.0\vc\include\list(835) : see reference to function template instantiation 'void std::_Wrap_alloc<std::allocator<_Other>>::construct<_Ty,const std::unique_ptr<test,std::default_delete<test>>&>(_Ty *,const std::unique_ptr<test,std::default_delete<test>> &)' being compiled
1> with
1> [
1> _Other=std::_List_node<std::unique_ptr<test,std::default_delete<test>>,void *>
1> , _Ty=std::unique_ptr<test,std::default_delete<test>>
1> ]
1> c:\program files (x86)\microsoft visual studio 12.0\vc\include\list(835) : see reference to function template instantiation 'void std::_Wrap_alloc<std::allocator<_Other>>::construct<_Ty,const std::unique_ptr<test,std::default_delete<test>>&>(_Ty *,const std::unique_ptr<test,std::default_delete<test>> &)' being compiled
1> with
1> [
1> _Other=std::_List_node<std::unique_ptr<test,std::default_delete<test>>,void *>
1> , _Ty=std::unique_ptr<test,std::default_delete<test>>
1> ]
1> c:\program files (x86)\microsoft visual studio 12.0\vc\include\list(1062) : see reference to function template instantiation 'std::_List_node<std::unique_ptr<test,std::default_delete<_Ty>>,void *> *std::_List_buy<std::unique_ptr<_Ty,std::default_delete<_Ty>>,_Alloc>::_Buynode<const std::unique_ptr<_Ty,std::default_delete<_Ty>>&>(std::_List_node<std::unique_ptr<_Ty,std::default_delete<_Ty>>,void *> *,std::_List_node<std::unique_ptr<_Ty,std::default_delete<_Ty>>,void *> *,const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)' being compiled
1> with
1> [
1> _Ty=test
1> , _Alloc=std::allocator<test_ptr>
1> ]
1> c:\program files (x86)\microsoft visual studio 12.0\vc\include\list(1062) : see reference to function template instantiation 'std::_List_node<std::unique_ptr<test,std::default_delete<_Ty>>,void *> *std::_List_buy<std::unique_ptr<_Ty,std::default_delete<_Ty>>,_Alloc>::_Buynode<const std::unique_ptr<_Ty,std::default_delete<_Ty>>&>(std::_List_node<std::unique_ptr<_Ty,std::default_delete<_Ty>>,void *> *,std::_List_node<std::unique_ptr<_Ty,std::default_delete<_Ty>>,void *> *,const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)' being compiled
1> with
1> [
1> _Ty=test
1> , _Alloc=std::allocator<test_ptr>
1> ]
1> c:\program files (x86)\microsoft visual studio 12.0\vc\include\list(1424) : see reference to function template instantiation 'void std::list<test_ptr,std::allocator<_Ty>>::_Insert<const std::unique_ptr<test,std::default_delete<test>>&>(std::_List_unchecked_const_iterator<std::_List_val<std::_List_simple_types<_Ty>>,std::_Iterator_base0>,const std::unique_ptr<test,std::default_delete<test>> &)' being compiled
1> with
1> [
1> _Ty=test_ptr
1> ]
1> c:\program files (x86)\microsoft visual studio 12.0\vc\include\list(1424) : see reference to function template instantiation 'void std::list<test_ptr,std::allocator<_Ty>>::_Insert<const std::unique_ptr<test,std::default_delete<test>>&>(std::_List_unchecked_const_iterator<std::_List_val<std::_List_simple_types<_Ty>>,std::_Iterator_base0>,const std::unique_ptr<test,std::default_delete<test>> &)' being compiled
1> with
1> [
1> _Ty=test_ptr
1> ]
1> c:\program files (x86)\microsoft visual studio 12.0\vc\include\list(1384) : see reference to function template instantiation 'void std::list<test_ptr,std::allocator<_Ty>>::_Insert_range<_Iter>(std::_List_unchecked_const_iterator<std::_List_val<std::_List_simple_types<_Ty>>,std::_Iterator_base0>,_Iter,_Iter,std::forward_iterator_tag)' being compiled
1> with
1> [
1> _Ty=test_ptr
1> , _Iter=std::_List_const_iterator<std::_List_val<std::_List_simple_types<std::unique_ptr<test,std::default_delete<test>>>>>
1> ]
1> c:\program files (x86)\microsoft visual studio 12.0\vc\include\list(1384) : see reference to function template instantiation 'void std::list<test_ptr,std::allocator<_Ty>>::_Insert_range<_Iter>(std::_List_unchecked_const_iterator<std::_List_val<std::_List_simple_types<_Ty>>,std::_Iterator_base0>,_Iter,_Iter,std::forward_iterator_tag)' being compiled
1> with
1> [
1> _Ty=test_ptr
1> , _Iter=std::_List_const_iterator<std::_List_val<std::_List_simple_types<std::unique_ptr<test,std::default_delete<test>>>>>
1> ]
1> c:\program files (x86)\microsoft visual studio 12.0\vc\include\list(924) : see reference to function template instantiation 'std::_List_iterator<std::_List_val<std::_List_simple_types<std::unique_ptr<test,std::default_delete<_Ty>>>>> std::list<test_ptr,std::allocator<std::unique_ptr<_Ty,std::default_delete<_Ty>>>>::insert<std::_List_const_iterator<std::_List_val<std::_List_simple_types<std::unique_ptr<_Ty,std::default_delete<_Ty>>>>>>(std::_List_const_iterator<std::_List_val<std::_List_simple_types<std::unique_ptr<_Ty,std::default_delete<_Ty>>>>>,_Iter,_Iter)' being compiled
1> with
1> [
1> _Ty=test
1> , _Iter=std::_List_const_iterator<std::_List_val<std::_List_simple_types<std::unique_ptr<test,std::default_delete<test>>>>>
1> ]
1> c:\program files (x86)\microsoft visual studio 12.0\vc\include\list(924) : see reference to function template instantiation 'std::_List_iterator<std::_List_val<std::_List_simple_types<std::unique_ptr<test,std::default_delete<_Ty>>>>> std::list<test_ptr,std::allocator<std::unique_ptr<_Ty,std::default_delete<_Ty>>>>::insert<std::_List_const_iterator<std::_List_val<std::_List_simple_types<std::unique_ptr<_Ty,std::default_delete<_Ty>>>>>>(std::_List_const_iterator<std::_List_val<std::_List_simple_types<std::unique_ptr<_Ty,std::default_delete<_Ty>>>>>,_Iter,_Iter)' being compiled
1> with
1> [
1> _Ty=test
1> , _Iter=std::_List_const_iterator<std::_List_val<std::_List_simple_types<std::unique_ptr<test,std::default_delete<test>>>>>
1> ]
1> c:\program files (x86)\microsoft visual studio 12.0\vc\include\list(917) : while compiling class template member function 'std::list<test_ptr,std::allocator<_Ty>>::list(const std::list<_Ty,std::allocator<_Ty>> &)'
1> with
1> [
1> _Ty=test_ptr
1> ]
1> c:\program files (x86)\microsoft visual studio 12.0\vc\include\xstring(1123) : see reference to function template instantiation 'std::list<test_ptr,std::allocator<_Ty>>::list(const std::list<_Ty,std::allocator<_Ty>> &)' being compiled
1> with
1> [
1> _Ty=test_ptr
1> ]
1> c:\code\test\test\main.cpp(17) : see reference to class template instantiation 'std::list<test_ptr,std::allocator<_Ty>>' being compiled
1> with
1> [
1> _Ty=test_ptr
1> ]
PS : posted this on
CONNECT
with an easier way to reproduce it .
std::pair<int, std::vector<std::unique_ptr<int>>> int_pair;
PPS : The bug has been fixed and the fix will be included in VS14 RTM .
source to share
MSVC bug fixed and fix will be included in RTM VS14: https://connect.microsoft.com/VisualStudio/feedbackdetail/view/960021
source to share