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

返回含std::unique_ptr的std::unordered_map引用时编译报错的原因咨询

返回含std::unique_ptr的std::unordered_map引用时编译报错的原因咨询

我写了一段C++代码,用Visual Studio 2022编译时遇到了报错,想请教下问题出在哪?先贴我的代码:

#include <unordered_map>
#include <memory>

class OneClass
{

};

using TestUnorderedMap = std::unordered_map<int, std::unique_ptr<OneClass>>;

class TestClass
{
public:
    TestUnorderedMap& getMap() { return m_map; }
private:
    TestUnorderedMap m_map;
};

void simpleTestFunction()
{
    TestClass t;
    TestUnorderedMap map = t.getMap();
}

编译时收到的错误信息片段是:

D:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.39.33519\include\xutility(241): error C2280: 'std::pair<const int,std::unique_ptr<OneClass,std::default_delete>>::pair(const std::pair<const int,std::unique_ptr<OneClass,std::default_delete>> &)': attempting to re...

我疑惑的点是:难道不能返回一个包含std::unique_ptr的std::unordered_map的引用吗?


兄弟,问题其实不是返回引用这件事本身,而是你后续的操作踩坑了~

咱们一步步捋:

  1. 你的getMap()函数返回引用是完全没问题的,它只是给你提供了一个访问TestClass内部m_map的通道而已。
  2. 真正出问题的是simpleTestFunction里的TestUnorderedMap map = t.getMap();这行:你这里是想把引用指向的原map完整拷贝一份到新的map对象里,但这事根本做不了。
  3. 原因很简单:std::unique_ptr是独占式智能指针,它的拷贝构造函数是被明确禁用的(相当于被标记成了delete)。而你的unordered_map里存的是std::pair<const int, std::unique_ptr<OneClass>>,这个pair因为包含不可拷贝的unique_ptr,它的拷贝构造也跟着废了,整个unordered_map自然也就没法正常拷贝了。编译器报的错就是在说这个:你试图调用一个已经被禁用的拷贝构造函数。

那怎么解决呢?分两种情况看:

  • 如果只是想用原对象里的map,不需要独立拷贝:直接用引用或者指针绑定就行,完全不会触发拷贝操作:
    // 用引用绑定原map,操作的就是TestClass内部的那个map
    TestUnorderedMap& map = t.getMap();
    // 或者用指针,效果类似
    TestUnorderedMap* map = &t.getMap();
    
  • 如果确实需要一份独立的副本:
    • 要么把std::unique_ptr换成支持拷贝的std::shared_ptr(不过得想清楚你的所有权需求,shared_ptr是共享所有权的);
    • 要么手动把原map里的元素移动到新map里(unique_ptr支持移动语义):
      TestUnorderedMap map;
      // 逐个移动元素,原map里的每个unique_ptr会被置空
      for (auto& item : t.getMap()) {
          map.insert(std::move(item));
      }
      // 或者直接移动整个map,这样原map会变成空的(如果允许的话)
      TestUnorderedMap map = std::move(t.getMap());
      

备注:内容来源于stack exchange,提问作者rbarreiros

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.17 07:48:03