jhe*_*dus 2 c++ set unique-ptr deleted-functions c++11
我正在尝试使用基于范围的迭代器与一组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
Run Code Online (Sandbox Code Playgroud)
代码的基础知识如下:
#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++;
}
}
Run Code Online (Sandbox Code Playgroud)
知道为什么这会是一个问题或如何解决它?
for (auto componentsIterator : *m_components)
Run Code Online (Sandbox Code Playgroud)
这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++;
}
Run Code Online (Sandbox Code Playgroud)
如您所见,您正在调用std::unique_ptr<Component>复制构造函数,但复制构造函数unique_ptr被删除(因为它违背了unique_ptr语义).
使用auto &采取基准来代替.
(顺便说一句,componentsIterator没有一个明智的名字,因为它不是一个迭代器,它是实际的元素)