将基于范围的 for 与 std::set<std::unique_ptr <T>一起使用>已删除函数

using range-based for with std::set<std::unique_ptr<T>> deleted function

本文关键字:gt std lt 一起 ptr 函数 删除 unique 范围 for 于范围      更新时间:2023-10-16

我试图使用一个基于范围的迭代器与一组unique_ptr实例,但我得到以下编译错误:

C2280: 'std::unique_ptr<Component,std::default_delete<_Ty>>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)' : attempting to reference a deleted function

基本代码如下:

#include <set>
#include <memory>
std::set<std::unique_ptr<Component>>* m_components;
class Component
{
    void DoSomething(){};
};
void ProcessComponents()
{
    for (auto componentsIterator : *m_components)
    {
        componentsIterator->DoSomething();
        componentsIterator++;
    }
}

知道为什么这将是一个问题或如何解决它吗?

for (auto componentsIterator : *m_components)

auto扩展为std::unique_ptr<Component>,这意味着您正在尝试对每个元素进行复制。这个循环实际上是:

for(auto it=m_components->begin(); it!=m_components->end(); ++it)
{
    std::unique_ptr<Component> componentsIterator=*it;
    componentsIterator->DoSomething();
    componentsIterator++;
}

可以看到,您正在调用std::unique_ptr<Component>复制构造函数,但是删除了unique_ptr的复制构造函数(因为它违反了unique_ptr的语义)。

auto &代替一个引用。

(顺便说一句,componentsIterator没有一个合理的名称,因为它不是迭代器,它是实际的元素)