GCC 4.4/4.5中的unique_ptr无法用于unordered_set/unordered_map,该怎么办?

6

有没有任何地方可以确认这个问题?我不确定是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上进行了测试。

这可能是因为 std::hash 没有为 std::unique_ptr 进行特化。 - Mankarse
1
@Mankarse 这个有一个专门的规范,但令人困惑的是它出现在 20.7.2.6 智能指针哈希支持 [util.smartptr.hash] (n3290) 中,在 std::shared_ptr 的规范之后,与 std::unique_ptr 相距甚远。 - Luc Danton
请注意,应该使用 std::move 而不是 move,这样就不会让 ADL 找到其他函数。 - Jonathan Wakely
3个回答

8
GCC 4.6.1接受您的代码,我认为没有任何问题(即关联容器的value_type必须是EmplaceInsertable且std::unique_ptr不会防止它)。这可能是GCC 4.5的缺陷。

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。

3
我可以确认这是GCC 4.4.5的问题。试图将unique_ptr插入std::set会导致一个长的编译器错误消息,暗示STL中的某个函数尝试复制unique_ptr:
错误:已删除函数[unique_ptr的复制构造函数]...在此处使用[g++-v4/bits/stl_tree.h:136]。
所涉及的STL函数是几个STL类的内部树结构的一部分,包括std::set。它还在一个“__GXX_EXPERIMENTAL_CXX0X__” ifdef中,这可能意味着GCC 4.4不正式支持我们正在尝试做的事情。
如果您不想升级到GCC 4.6,则始终可以包装一个std::vector并在代码的某些点上 strategically 检查和删除重复项。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接