C++ GCC 4.4/4.5唯一\u ptr不适用于无序\u集/无序\u映射

C++ GCC 4.4/4.5唯一\u ptr不适用于无序\u集/无序\u映射,c++,gcc,g++,c++11,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));

有什么地方可以确认吗?我不确定这是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;
}
#包括
#包括
使用名称空间std;
int main(){
无序的集合;
唯一的p(新的int(0));
s、 插入(移动(p));
返回0;
}

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

GCC 4.6.1接受您的原样代码,我看不出有任何问题(即关联容器的值类型要求是可插入的,并且
std::unique\u ptr
不阻止这一点)。这可能是GCC 4.5中的一个缺陷。

我可以确认这是GCC 4.4.5中的一个问题。试图将唯一的_ptr插入std::set会导致一条长的编译器错误消息,这暗示STL中的某些函数试图复制唯一的_ptr:

错误:已删除函数[唯一的\u ptr的副本]。。。这里用 [g++-v4/bits/stl_-tree.h:136]

所讨论的STL函数是几个STL类的内部树结构的一部分,包括std::set。它也在一个“uu GXX_EXPERIMENTAL_CXX0X_uuu”ifdef中,这可能意味着GCC4.4并不正式支持我们正在尝试做的事情


如果您不想升级到GCC4.6,您可以始终包装一个std::vector,并在代码中的某些点战略性地检查和删除重复项。

您的代码是正确的。这是GCC 4.5中的一个已知问题。它已在4.6中修复。看见它也会影响已排序的容器(std::map、std::set等)。可能最简单的解决方法(性能稍有下降)是使用std::shared_ptr而不是std::unique_ptr。

这可能是因为
std::hash
不是专门用于
std::unique_ptr
@Mankarse的,它有专门化,但令人困惑的是,它出现在20.7.2.6智能指针哈希支持中[util.smartptr.hash](n3290)就在
std::shared\u ptr
的规范之后,距离
std::unique\u ptr
有点远。注意,您应该说
std::move
而不是
move
,您不希望ADL找到不同的函数。