C++ GCC 4.4/4.5唯一\u ptr不适用于无序\u集/无序\u映射
有什么地方可以确认吗?我不确定这是GCC的问题还是我的代码的问题。例如,以下代码未编译: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));
#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找到不同的函数。