如何规避GCC 5.5中unordered_map的编译bug?
这个问题其实是GCC 5.5版本标准库实现的一个细节缺陷——你的代码里直接把原始指针new std::vector<uint8_t>(1)传给emplace,GCC 5.5的std::unordered_map::emplace在尝试构造内部的std::pair时,没办法正确完成从原始指针到std::shared_ptr的隐式转换,而GCC 6.1修复了这个实现上的问题,所以能正常编译。
有几个简单的规避方法,按推荐程度排序:
最推荐:用
std::make_shared显式构造shared_ptr
这种方式不仅能解决编译问题,还更安全(避免内存泄漏风险),内存分配也更高效:int main() { foo.emplace(0, std::make_shared<std::vector<uint8_t>>(1)); }显式构造
std::shared_ptr
如果不想用make_shared,也可以直接显式构造shared_ptr再传递,跳过隐式转换的步骤:int main() { foo.emplace(0, std::shared_ptr<std::vector<uint8_t>>(new std::vector<uint8_t>(1))); }用
std::piecewise_construct明确构造pair
这个方法更繁琐,但也能解决问题,适合需要精细控制构造过程的场景:#include <tuple> // 需要引入tuple头文件 int main() { foo.emplace(std::piecewise_construct, std::forward_as_tuple(0), std::forward_as_tuple(new std::vector<uint8_t>(1))); }
总结一下,核心思路就是避免让emplace依赖隐式转换来构造std::shared_ptr,要么显式构造智能指针,要么用更安全的make_shared,就能绕过GCC 5.5的这个实现缺陷。
内容的提问来源于stack exchange,提问作者Timmmm
相关产品推荐
相关产品推荐

