C++ Can';t创建可移动可构造对象的映射

C++ Can';t创建可移动可构造对象的映射,c++,c++11,unique-ptr,stdmap,C++,C++11,Unique Ptr,Stdmap,我有一个包含std::unique\u ptr的类,我想把这个类的实例放在std::map中。我认为促使移动语义学引入C++的其中一个因素是在标准容器中放置“ UNQuijPPTRS/CODE >之类的东西(在向量的情况下,这真的有效)。但在我看来,std::map似乎不喜欢这个想法。为什么会这样 #include <map> #include <memory> int main() { std::map<int,std::unique_ptr<in

我有一个包含
std::unique\u ptr
的类,我想把这个类的实例放在
std::map
中。我认为促使移动语义学引入C++的其中一个因素是在标准容器中放置“<代码> UNQuijPPTRS/CODE >之类的东西(在向量的情况下,这真的有效)。但在我看来,
std::map
似乎不喜欢这个想法。为什么会这样

#include <map>
#include <memory>

int main()
{
    std::map<int,std::unique_ptr<int>> map;

    // error on the line that follows (use of disabled lvalue copy constructor)
    map.insert(std::make_pair(1,std::unique_ptr<int>(new int(2))));

    return 0;
}
#包括
#包括
int main()
{
地图;
//以下行出错(使用禁用的左值复制构造函数)
map.insert(std::make_pair(1,std::unique_ptr(新int(2)));
返回0;
}
谢谢

--编辑

更清楚地说,确切的错误消息如下:

mingw32-g++.exe --std=gnu++0x   -ID:\CodeEnv\Libraries\Boost  -c D:\CodeEnv\CodeMess\Untitled1.cpp -o D:\CodeEnv\CodeMess\Untitled1.o
mingw32-g++.exe  -o D:\CodeEnv\CodeMess\Untitled1.exe D:\CodeEnv\CodeMess\Untitled1.o   
In file included from c:\mingw\bin\../lib/gcc/mingw32/4.4.1/include/c++/bits/stl_algobase.h:66,
                 from c:\mingw\bin\../lib/gcc/mingw32/4.4.1/include/c++/bits/stl_tree.h:62,
                 from c:\mingw\bin\../lib/gcc/mingw32/4.4.1/include/c++/map:60,
                 from D:\CodeEnv\CodeMess\Untitled1.cpp:1:
c:\mingw\bin\../lib/gcc/mingw32/4.4.1/include/c++/bits/unique_ptr.h: In copy constructor 'std::pair<const int, std::unique_ptr<int, std::default_delete<int> > >::pair(const std::pair<const int, std::unique_ptr<int, std::default_delete<int> > >&)':
c:\mingw\bin\../lib/gcc/mingw32/4.4.1/include/c++/bits/stl_pair.h:68:   instantiated from 'std::_Rb_tree_node<_Val>::_Rb_tree_node(_Args&& ...) [with _Args = const std::pair<const int, std::unique_ptr<int, std::default_delete<int> > >&, _Val = std::pair<const int, std::unique_ptr<int, std::default_delete<int> > >]'
c:\mingw\bin\../lib/gcc/mingw32/4.4.1/include/c++/ext/new_allocator.h:111:   instantiated from 'void __gnu_cxx::new_allocator<_Tp>::construct(_Tp*, _Args&& ...) [with _Args = const std::pair<const int, std::unique_ptr<int, std::default_delete<int> > >&, _Tp = std::_Rb_tree_node<std::pair<const int, std::unique_ptr<int, std::default_delete<int> > > >]'
c:\mingw\bin\../lib/gcc/mingw32/4.4.1/include/c++/bits/stl_tree.h:394:   instantiated from 'std::_Rb_tree_node<_Val>* std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_M_create_node(_Args&& ...) [with _Args = const std::pair<const int, std::unique_ptr<int, std::default_delete<int> > >&, _Key = int, _Val = std::pair<const int, std::unique_ptr<int, std::default_delete<int> > >, _KeyOfValue = std::_Select1st<std::pair<const int, std::unique_ptr<int, std::default_delete<int> > > >, _Compare = std::less<int>, _Alloc = std::allocator<std::pair<const int, std::unique_ptr<int, std::default_delete<int> > > >]'
c:\mingw\bin\../lib/gcc/mingw32/4.4.1/include/c++/bits/stl_tree.h:881:   instantiated from 'std::_Rb_tree_iterator<_Val> std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_M_insert_(const std::_Rb_tree_node_base*, const std::_Rb_tree_node_base*, const _Val&) [with _Key = int, _Val = std::pair<const int, std::unique_ptr<int, std::default_delete<int> > >, _KeyOfValue = std::_Select1st<std::pair<const int, std::unique_ptr<int, std::default_delete<int> > > >, _Compare = std::less<int>, _Alloc = std::allocator<std::pair<const int, std::unique_ptr<int, std::default_delete<int> > > >]'
c:\mingw\bin\../lib/gcc/mingw32/4.4.1/include/c++/bits/stl_tree.h:1177:   instantiated from 'std::pair<typename std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator, bool> std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_M_insert_unique(const _Val&) [with _Key = int, _Val = std::pair<const int, std::unique_ptr<int, std::default_delete<int> > >, _KeyOfValue = std::_Select1st<std::pair<const int, std::unique_ptr<int, std::default_delete<int> > > >, _Compare = std::less<int>, _Alloc = std::allocator<std::pair<const int, std::unique_ptr<int, std::default_delete<int> > > >]'
c:\mingw\bin\../lib/gcc/mingw32/4.4.1/include/c++/bits/stl_map.h:500:   instantiated from 'std::pair<typename std::_Rb_tree<_Key, std::pair<const _Key, _Tp>, std::_Select1st<std::pair<const _Key, _Tp> >, _Compare, typename _Alloc::rebind<std::pair<const _Key, _Tp> >::other>::iterator, bool> std::map<_Key, _Tp, _Compare, _Alloc>::insert(const std::pair<const _Key, _Tp>&) [with _Key = int, _Tp = std::unique_ptr<int, std::default_delete<int> >, _Compare = std::less<int>, _Alloc = std::allocator<std::pair<const int, std::unique_ptr<int, std::default_delete<int> > > >]'
D:\CodeEnv\CodeMess\Untitled1.cpp:7:   instantiated from here
c:\mingw\bin\../lib/gcc/mingw32/4.4.1/include/c++/bits/unique_ptr.h:214: error: deleted function 'std::unique_ptr<_Tp, _Tp_Deleter>::unique_ptr(const std::unique_ptr<_Tp, _Tp_Deleter>&) [with _Tp = int, _Tp_Deleter = std::default_delete<int>]'
c:\mingw\bin\../lib/gcc/mingw32/4.4.1/include/c++/bits/stl_pair.h:68: error: used here
In file included from c:\mingw\bin\../lib/gcc/mingw32/4.4.1/include/c++/map:60,
                 from D:\CodeEnv\CodeMess\Untitled1.cpp:1:
c:\mingw\bin\../lib/gcc/mingw32/4.4.1/include/c++/bits/stl_tree.h: In constructor 'std::_Rb_tree_node<_Val>::_Rb_tree_node(_Args&& ...) [with _Args = const std::pair<const int, std::unique_ptr<int, std::default_delete<int> > >&, _Val = std::pair<const int, std::unique_ptr<int, std::default_delete<int> > >]':
c:\mingw\bin\../lib/gcc/mingw32/4.4.1/include/c++/bits/stl_tree.h:136: note: synthesized method 'std::pair<const int, std::unique_ptr<int, std::default_delete<int> > >::pair(const std::pair<const int, std::unique_ptr<int, std::default_delete<int> > >&)' first required here 
mingw32-g++.exe--std=gnu++0x-ID:\codenv\Libraries\Boost-cd:\codenv\codemesss\Untitled1.cpp-od:\codenv\codemesss\Untitled1.o
mingw32-g++.exe-o D:\codenv\CodeMess\Untitled1.exe D:\codenv\CodeMess\Untitled1.o
在c:\mingw\bin\../lib/gcc/mingw32/4.4.1/include/c++/bits/stl_algobase.h:66中包含的文件中,
从c:\mingw\bin\../lib/gcc/mingw32/4.4.1/include/c++/bits/stl_tree.h:62,
从c:\mingw\bin\../lib/gcc/mingw32/4.4.1/include/c++/map:60,
来自D:\codenv\codemes\Untitled1.cpp:1:
c:\mingw\bin\../lib/gcc/mingw32/4.4.1/include/c++/bits/unique\u ptr.h:在复制构造函数“std::pair::pair(const std::pair&)”中:
c:\mingw\bin\../lib/gcc/mingw32/4.4.1/include/c++/bits/stl_-pair.h:68:从“std::_-Rb_-tree_-node:::_-Rb_-tree_-node(_-Args&&…[带有_-Args=const-std::pair&,_-Val=std::pair])实例化
c:\mingw\bin\../lib/gcc/mingw32/4.4.1/include/c++/ext/new_allocator.h:111:从“void”\uu gnu cxx::new_allocator::const std::pair、\u Tp=std:\u Rb_树节点”实例化
c:\mingw\bin\../lib/gcc/mingw32/4.4.1/include/c++/bits/stl_tree.h:394:从“std::_Rb_tree_node*std::_Rb_tree:::_M_create_node(_Args&&…[带参数=const std::pair&,_Key=int,_Val=std::pair,_KeyOfValue=std:_Select1st:_Compare=std::less,_Alloc=std::Alloc::分配器])
c:\mingw\bin\../lib/gcc/mingw32/4.4.1/include/c++/bits/stl_tree.h:881:从'std::_Rb_tree_iterator std::_Rb_tree::_M_insert_(const std:_Rb_tree_node_base*,const std:_Rb_tree_node_base*,const)Val&[带(Key=int,(Val=std:)对,(KeyOfValue=1st,)allow=std:)allost,)std:)分配程序,)std:)
c:\mingw\bin\../lib/gcc/mingw32/4.4.1/include/c++/bits/stl_tree.h:1177:从“std::pair std::”实例化::_Rb_tree:::_M_insert_unique(const)Val&[带_Key=int,_Val=std::pair,_KeyOfValue=std::_Select1st,_Compare=std::less,_Alloc=std::Alloc::分配器]”
c:\mingw\bin\../lib/gcc/mingw32/4.4.1/include/c++/bits/stl_-map.h:500:从“std::pair std::map::insert(const std::pair&)[with _Key=int,_Tp=std::unique_ptr,_Compare=std::less,_Alloc=std::分配器]实例化”
D:\codenv\codemse\Untitled1.cpp:7:从此处实例化
c:\mingw\bin\../lib/gcc/mingw32/4.4.1/include/c++/bits/unique\u ptr.h:214:错误:删除了函数“std::unique\u ptr::unique\u ptr(const std::unique\u ptr&)[带-Tp=int,\Tp\u Deleter=std::default\u delete]”
c:\mingw\bin\../lib/gcc/mingw32/4.4.1/include/c++/bits/stl_pair.h:68:错误:此处使用
在c:\mingw\bin\../lib/gcc/mingw32/4.4.1/include/c++/map:60中包含的文件中,
来自D:\codenv\codemes\Untitled1.cpp:1:
c:\mingw\bin\../lib/gcc/mingw32/4.4.1/include/c++/bits/stl_tree.h:在构造函数的std::_Rb_tree_node::_Rb_tree_node(_Args&…[带_Args=const std::pair&,_Val=std::pair]:
c:\mingw\bin\../lib/gcc/mingw32/4.4.1/include/c++/bits/stl_tree.h:136:注意:这里首先需要合成方法“std::pair::pair(const std::pair&)”
这似乎是
std::pair
的问题,但单独使用时效果非常好:

int main()
{
    std::pair<int,std::unique_ptr<int>> pair;

    pair = std::make_pair(1,std::unique_ptr<int>(new int(2))); // no errors
    return 0;
}
intmain()
{
std::成对;
pair=std::make_pair(1,std::unique_ptr(新int(2));//无错误
返回0;
}
虽然这显然并不意味着它不能被滥用:

int main()
{
    std::pair<int,std::unique_ptr<int>> pair1,pair2;

    pair1 = std::make_pair(1,std::unique_ptr<int>(new int(2))); // no errors
    pair2 = pair1; // BOOM ! Copy from lvalue
    return 0;
}
intmain()
{
std::配对1,配对2;
pair1=std::make_pair(1,std::unique_ptr(新int(2));//无错误
pair2=pair1;//轰!从左值复制
返回0;
}
这可能就是
std::map
内部发生的情况

线索

--编辑

查看错误消息,TDM-GCC4.4.1的
std::map
实现确实存在问题。它似乎没有像
std::vector::push\u back(value\u type&&)
这样的移动语义感知插入方法


现在该怎么办?

您正在使用什么编译器?它使用VS10 beta 2编译得很好


编辑:问题中的编译器是GCC

这似乎是STL实现中的一个错误,因为GCC是开源的,您可以提交修补程序来修复此问题。
幸运的是,修复程序在STL代码中,而不是编译器代码中,所以应该不会太难


同时,您可以在本地
/
映射
头文件中输入修复程序。

我遇到了相同的问题。通过修补bits/stl_map.h和bits/stl_tree.h,我可以不费吹灰之力地添加所需的功能。为了让您的特定示例正常工作,您基本上只需向map类添加一个insert(value_type&&)方法。它本质上与insert(const value_type&)相同,但在适当的地方使用std::move()。您还必须添加正确的支持方法,但是您可以使用编译错误来告诉您需要什么


这个问题已经报告给GCC团队(),有人正在研究它,所以希望我们很快就能看到在关联和无序容器中移动可构造文件的支持。

顺便说一句,它实际上是一个用于Windows的GCC 4.4.1端口(TDM-GCC:)。哈哈。我现在正是这么做的。惨败