我有什么地方可以证实吗?我不确定这是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上进行了测试。
答案 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,并在代码中的某些位置策略性地检查和删除重复项。