You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何规避GCC 5.5中unordered_map的编译bug?

解决GCC 5.5中std::unordered_map::emplace配合std::shared_ptr的编译错误

这个问题其实是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:00:50