c++ - 为什么在将唯一指针插入无序映射时 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++ 会给我这个错误?
解决方案
这个:
m_Tests.emplace(testName, test);
将尝试复制test
,因为 (a) 它是一个左值表达式,(b) 表达式从不具有引用类型,并且 (c)emplace
不采用左值引用。
unique_ptr
s 无法复制。
这是std::move
为了什么!
m_Tests.emplace(testName, std::move(test));
现在你有了一个右值表达式,它非常适合绑定到emplace
确实需要的右值引用。
我实际上稍微有点躺在这里,因为emplace
是可变参数,所以事情有点复杂。但是无所谓。重要的是,您正在为此创建所有权链中的另一个链接unique_ptr
,最终将所有权传递给地图,并且std::move
是这样做的方式。
推荐阅读
- python - Pandas 语法中的数据框关于以下内容的错误:
- button - Syncfusion按钮如何在视图模型上触发视觉状态-Xamarin Forms
- javascript - 使用 sinon 对带有 got 模块的函数进行单元测试
- javascript - 如何实现范围与数字输入绑定的滑块
- api - gmsh 的 julia API 可以用于自适应网格细化吗?
- django - 码头上的 Django;静态文件消失
- java - 即使文件夹存在,file.listFiles() 也会返回 null
- shell - 在 awk 中打印最后一个非空列的值
- wordpress - 如何在 bash 脚本的 wp 注释列表中使用 date_query 参数
- mysql - SQLNonTransientConnectionException:使用 Hibernate 和 C3p0 关闭连接后不允许任何操作