C++ - unordered_map 中的 unique_ptr 导致错误

C++ - unique_ptr within a unordered_map leads to errors

我有一个程序给我一个模糊的错误,所以我制作了这个简化版本而不是 post 数百行代码:

#include <unordered_map>
#include <memory>
#include <utility>

struct s
{
    int height;
    std::unordered_map<std::string, std::unique_ptr<s>> children;
};

void InitWD(s &wd_ptr, int height, std::unordered_map<std::string, std::unique_ptr<s>> children) //Initialize a WindowData
{
    wd_ptr.children=children;
    wd_ptr.height=height;
}

int main()
{
  s test;
  test.height=1;
  test.children=std::unordered_map<std::string, std::unique_ptr<s>>();
  std::unique_ptr<s> ptr(new s);
  InitWD(*ptr, 2, std::unordered_map<std::string, std::unique_ptr<s>>());
  test.children.emplace("two", std::move(ptr));
}

错误(GCC 4.8 和 C++11)是关于 unique_ptrunordered_map,我相信:

error: use of deleted function 'constexpr std::pair<_T1, _T2>::pair(const std::pair<_T1, _T2>&) [with _T1 = const std::basic_string<char>; _T2 = std::unique_ptr<s>]'

也许在代码的某处 a unique_ptr 被复制了?这是我唯一能想到的会导致这样的错误。

感谢任何帮助!

错误在这里:

wd_ptr.children=children;

这会尝试 children 复制到 wd_ptr.children。您需要将其更改为:

wd_ptr.children = std::move(children);

不幸的是,无论是 gcc 还是 clang 都无法生成诊断信息,实际告诉您代码的哪一行是错误的。