C++ 有没有办法在C+;中的映射中插入唯一的ptr+;0x/gcc 4.4.7)?

C++ 有没有办法在C+;中的映射中插入唯一的ptr+;0x/gcc 4.4.7)?,c++,c++11,gcc,gcc4.4,C++,C++11,Gcc,Gcc4.4,我不知道怎么做;它快把我逼疯了 #include <iostream> #include <memory> #include <map> int main() { std::map<std::string, std::unique_ptr<std::string>> map; std::unique_ptr<std::string> bar(new std::string("bar")); map[

我不知道怎么做;它快把我逼疯了

#include <iostream>
#include <memory>
#include <map>

int main()
{
    std::map<std::string, std::unique_ptr<std::string>> map;
    std::unique_ptr<std::string> bar(new std::string("bar"));
    map["foo"] = std::move(bar);

    std::cout << "foo: " << *(map["foo"]) << std::endl;
}
我可以使
很好,但是当我尝试
将它移动到
插入时,我得到了错误。它似乎出于某种原因试图调用复制构造函数,但我不明白为什么,因为我正在移动它

emplace
具有相同的结果:

int main()
{
    std::map<std::string, std::unique_ptr<std::string>> map;
    std::unique_ptr<std::string> bar(new std::string("bar"));
    auto pair = std::make_pair("foo", std::move(bar));
    map.emplace(std::move(pair));

    std::cout << "foo: " << *(map["foo"]) << std::endl;
}
intmain()
{
地图;
std::unique_ptr bar(新std::string(“bar”);
自动配对=std::make_pair(“foo”,std::move(bar));
地图安放(标准::移动(对));

STD::CUT> PGC4.4.7没有提供对C++ 11特征的完全支持,所以期望所有C++ 11特性都能正常工作是不现实的。在这种情况下,编译器不是为你生成移动分配和移动拷贝方法。所以,当<>代码> STD::MAP< /Cord>尝试赋值或复制时,它使用常规默认的,即为
唯一\u ptr
删除

如果您只需要一个智能指针,您可以使用
shared\ptr

std::map<std::string, std::shared_ptr<std::string>> map;
std::shared_ptr<std::string> bar = std::make_shared<std::string>("bar");
map["foo"] = bar;
std::map;
std::shared_ptr bar=std::make_shared(“bar”);
地图[“foo”]=条形图;

> p> Gcc4.4.7并不能完全支持C++ 11的特性,所以期望所有C++ 11的特性都能正常工作是不现实的。在这种情况下,编译器不是为你生成移动分配和移动拷贝方法。所以,当<>代码>:STD::MAP<代码>尝试分配或复制时,它使用的是常规默认的DE。为
唯一\u ptr
删除

如果您只需要一个智能指针,您可以使用
shared\ptr

std::map<std::string, std::shared_ptr<std::string>> map;
std::shared_ptr<std::string> bar = std::make_shared<std::string>("bar");
map["foo"] = bar;
std::map;
std::shared_ptr bar=std::make_shared(“bar”);
地图[“foo”]=条形图;

我已经研究了这个问题。map的STL实现正确地定义了一个移动构造函数:

#ifdef __GXX_EXPERIMENTAL_CXX0X__
      template<typename... _Args>
        _Rb_tree_node(_Args&&... __args)
    : _Rb_tree_node_base(),
      _M_value_field(std::forward<_Args>(__args)...) { }
#endif
    };
\ifdef\uuuugxx\ucx0x__
模板
_Rb_树节点(_参数&&…_参数)
:_Rb_tree_node_base(),
_M_值_字段(std::forward(u参数)…{}
#恩迪夫
};
此外,正如错误输出中所述,这被称为
std::pair
也定义了move构造函数,但未调用此构造函数

我认为,
std::forward
和推断的Args类型有问题:

usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../../../../../include/c++/4.4.7/bits/stl_tree.h: 在构造函数的std::_Rb_tree_节点::_Rb_tree_节点(_Args&&…) [带_Args=const std::pair&

如您所见,_Args的类型是一个常量引用,由forward转发,并调用正则对构造函数


我假设,有人可能会摆弄stl_tree.h来修复它-例如,通过删除std::forward并仅强制转换arg to rvalue引用。这当然不正确,但可能适用于特定情况。

我已经研究了这个问题。映射的stl实现正确地定义了一个move构造函数:

#ifdef __GXX_EXPERIMENTAL_CXX0X__
      template<typename... _Args>
        _Rb_tree_node(_Args&&... __args)
    : _Rb_tree_node_base(),
      _M_value_field(std::forward<_Args>(__args)...) { }
#endif
    };
\ifdef\uuuugxx\ucx0x__
模板
_Rb_树节点(_参数&&…_参数)
:_Rb_tree_node_base(),
_M_值_字段(std::forward(u参数)…{}
#恩迪夫
};
此外,正如错误输出中所述,它被调用。
std::pair
也定义了move构造函数,但没有调用这个构造函数

我认为,
std::forward
和推断的Args类型有问题:

usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../../../../../include/c++/4.4.7/bits/stl_tree.h: 在构造函数的std::_Rb_tree_节点::_Rb_tree_节点(_Args&&…) [带_Args=const std::pair&

如您所见,_Args的类型是一个常量引用,由forward转发,并调用正则对构造函数


我想,有人可能会摆弄stl_tree.h来修复它——例如,通过删除std::forward并将arg转换为右值引用。当然,这是不正确的,但可能适用于特定情况。

试试boost。4.4.7太旧,无法支持标准。@n.m:boost无法解决此问题。包含/链接boost无法神奇地添加mov实际上,c++0x模式下的gcc 4.4.7支持移动语义:。@LightnessRacesinOrbit boost::unique_ptr是在移动语义之前发明的。@n.m.:什么?“unique_ptr不可复制,也不可复制分配,但它是可移动和可移动分配的。”你希望它还能工作吗?你把它和它取代的
std::auto_ptr
混淆了吗?试试boost。4.4.7太旧了,不支持这个标准。@n.m.:boost不能解决这个问题。包含/链接boost不能神奇地将移动语义添加到语言中。实际上,c++0x模式下的gcc 4.4.7支持移动语义:。@lightnessreacesinOrbit boost::unique_ptr是在移动语义之前发明的。@n.m:什么?“unique_ptr不可复制构造,也不可复制分配,但它是可移动构造和移动分配的。”你希望它还能工作吗?你把它和它取代的
std::auto_ptr
混淆了吗?祝你好运。他不喜欢这个答案。编译器不需要生成它们,它们包含在gcc 4.4的stl_映射实现中。好吧,所以听起来我的问题的答案只是“不”--没关系,我会想些别的办法。谢谢你的帮助!祝你好运。他不喜欢这个答案。编译器不需要生成它们,它们包含在gcc 4.4的stl_映射实现中。好吧,所以听起来我的问题的答案只是“不”--那很好;我会想些别的办法的。谢谢你的帮助!谢谢你调查此事!老实说,这是我无法理解的,不幸的是,我不能去摆弄STL头,因为我不能简单地升级到更新版本的GCC,但我真的很感谢你的深入研究。我想我不会这么做的o接受我想做的事情是不可能的,继续前进。谢谢你调查此事!老实说,这是我的头绪,不幸的是我不能去