GCC 4.4 / 4.5 unique_ptr对unordered_set / unordered_map不起作用

时间:2011-09-08 03:06:03

标签: c++ gcc g++ c++11

我有什么地方可以证实吗?我不确定这是GCC还是我的代码的问题。例如,以下代码无法编译:

#include <unordered_set>
#include <memory>
using namespace std;

int main() {
    unordered_set<unique_ptr<int> > s;
    unique_ptr<int> p(new int(0));
    s.insert(move(p));
    return 0;
}

错误信息太大,我不想放在这里。 GCC版本是4.5.3,编译标志是-std = gnu ++ 0x。也在4.4.5上进行了测试。

3 个答案:

答案 0 :(得分:8)

GCC 4.6.1按原样接受你的代码,我发现它没有任何问题(即关联容器的value_type必须是EmplaceInsertable,std::unique_ptr不能阻止它)。据推测这是GCC 4.5的缺陷。

答案 1 :(得分:4)

您的代码是正确的。这是GCC 4.5中的一个已知问题。它已在4.6中修复。见http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44436。它也会影响有序容器(std :: map,std :: set等)。可能最简单的解决方法(略有性能损失)是使用std :: shared_ptr而不是std :: unique_ptr。

答案 2 :(得分:3)

我可以确认这是GCC 4.4.5的问题。尝试将unique_ptr插入std :: set会导致编译错误消息,这可能会导致STL中的某些函数尝试复制unique_ptr:

  

错误:已删除的函数[unique_ptr的copy ctor] ...在这里使用   并[g ++ - V4 /比特/ stl_tree.h:136]

有问题的STL函数是几个STL类的内部树结构的一部分,包括std :: set。它也在“__GXX_EXPERIMENTAL_CXX0X__”ifdef中,这可能意味着GCC 4.4没有正式支持我们正在尝试做的事情。

如果您不想升级到GCC 4.6,您可以始终包装std :: vector,并在代码中的某些位置策略性地检查和删除重复项。