首页 > 解决方案 > 为什么在将唯一指针插入无序映射时 C++ 会给我一个错误?

问题描述

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

    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++ 会给我这个错误?

标签: c++unique-ptrunordered-map

解决方案


这个:

m_Tests.emplace(testName, test);

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

unique_ptrs 无法复制。

这是std::move为了什么!

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

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

我实际上稍微有点躺在这里,因为emplace是可变参数,所以事情有点复杂。但是无所谓。重要的是,您正在为此创建所有权链中的另一个链接unique_ptr,最终将所有权传递给地图,并且std::move是这样做的方式。


推荐阅读