gpt4 book ai didi

c++试图引用已删除的函数

转载 作者:行者123 更新时间:2023-11-28 06:50:09 24 4
gpt4 key购买 nike

我一直在研究 std::unique_ptrstd::for_each 算法来学习它们,然后我收到这个错误“试图引用已删除的函数"当我试图将一些变量从一个容器 (std::map) 移动到另一个容器时。

此代码当前在成员函数中执行。 Foo 只是一个泛型类。

std::for_each(m_list1.begin(), m_list1.end(),
[&](std::pair<std::size_t,std::unique_ptr<Foo>> data_pair)
{
m_list2[data_pair.first] = std::unique_ptr<Foo>(std::move(data_pair.second));
});
m_list1.clear();

我尝试了各种方法,但问题仍然存在。然后我尝试使用基于范围的 for 来代替,突然它起作用了。

for (auto& data_pair : m_list1)
{
m_list2[data_pair.first] = std::unique_ptr<Foo>(std::move(data_pair.second));
}
m_list1.clear();

我想知道的是为什么第二个代码执行没有问题,而第一个代码产生错误。

如果您需要更具体的信息,请询问。如果我的编码风格有不好的做法,请就如何改进提出建议。

最佳答案

您的 for_each 中有两个错误代码。一、map::value_typepair<const Key, Value> .其次,您的 lambda 表达式按值获取参数,这意味着它尝试复制 unique_ptr ,因此错误。要修复它,请通过引用获取参数。

[&](std::pair<const std::size_t, std::unique_ptr<Foo>>& data_pair)
// ^^^^^ ^^^
{
m_list2[data_pair.first] = std::unique_ptr<Foo>(std::move(data_pair.second));
}

更好的选择是不明确提及这些类型,而是使用 decltype

[&](decltype(m_list1)::value_type& data_pair)
{
m_list2[data_pair.first] = std::unique_ptr<Foo>(std::move(data_pair.second));
}

现在,您的基于范围的 for之所以有效,是因为您绑定(bind)了 map 的元素使用 for(auto& data_pair : m_list1) 作为引用.如果您改为使用 for(auto data_pair : m_list1),您会遇到与以前相同的错误因为那会尝试制作元素的拷贝。

关于c++试图引用已删除的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24102904/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com