使用基于范围的for与std :: set <std :: unique_ptr <t>&gt;删除函数</std :: unique_ptr <t>

时间:2014-05-10 17:06:59

标签: c++ c++11 set unique-ptr deleted-functions

我正在尝试使用带有一组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 个答案:

答案 0 :(得分:7)

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 &代替参考。

(BTW,componentsIterator没有合理的名称,因为它不是迭代器,它是实际的元素)