Использование на основе диапазона для с удаленной функцией std:: set<std:: unique_ptr <T >>

Я пытаюсь использовать итератор на основе диапазона с набором 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++;
    }
}

Есть идеи, почему это будет проблемой или как ее решить?

1 ответ

Решение
for (auto componentsIterator : *m_components)

Тот auto расширяется до std::unique_ptr<Component>Это означает, что вы пытаетесь взять копию каждого элемента. IOW, этот цикл на самом деле:

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 нет разумного имени, так как это не итератор, это фактический элемент)

Другие вопросы по тегам