为什么 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
是做到这一点的方法。
在具有以下成员和方法的 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
是做到这一点的方法。