为什么 C++ 在将唯一指针插入无序映射时给我一个错误?

why does C++ give me an error when inserting unique pointer into unordered map?

在具有以下成员和方法的 class 中:

    std::unordered_map<std::string, std::unique_ptr<test::Test>> m_Tests;
    
    void test::TestMenu::addTest(const std::string &testName, std::unique_ptr<test::Test> test) {
        m_Tests.emplace(testName, test);
    }

这样调用:

testMenu.addTest("Test Clear Color", std::make_unique<test::TestClearColor>());

编译器传递错误:

error: no matching function for call to 'construct_at'
          std::construct_at(__p, std::forward<_Args>(__args)...);

我的问题是为什么 C++ 给我这个错误?

这个:

m_Tests.emplace(testName, test);

将尝试复制 test,因为 (a) 它是一个 左值 表达式,(b) 表达式永远没有引用类型,并且 (c) emplace 不采用左值引用。

unique_ptr无法复制。

这就是 std::move 的用途!

m_Tests.emplace(testName, std::move(test));

现在你有了一个右值表达式,它非常适合绑定到 emplace 接受的右值引用。

我实际上有点说谎了,事情有点复杂,因为 emplace 是可变的。但是无所谓。重要的是,您正在为此 unique_ptr 的所有权链中创建另一个 link,最终将所有权传递给地图,而 std::move 是做到这一点的方法。