如何从重载的下标 [] 运算符返回 std::unique_ptr&?

How to return std::unique_ptr& from overloaded Subscripting [] Operator?

本文关键字:unique std ptr 返回 运算符 重载 下标      更新时间:2023-10-16

我有一个阶级世界,该阶级世界具有一个独特的指针,可以进行类瓷砖。World具有返回对向量持有的unique_ptr的引用。

#include <memory>
#include <vector>
#include "Tile.h"
class World
{
public:
    std::unique_ptr<Tile>& get(unsigned int i) { return Vector[i]; }
private:
    std::vector<std::unique_ptr<Tile>> Vector;
}

我想用超载运算符替换GET功能:

std::unique_ptr<Tile>& operator[](unsigned int i) { return Vector[i]; }

但是,当我调用世界[i]时,我会遇到以下错误:

error C2280: 'std::unique_ptr<Tile,std::default_delete<_Ty>>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)': attempting to reference a deleted function with[_Ty=Tile]

我在做什么错?

问题不在您发布的摘要中。取而代之的是,将operator[]的返回值与变量绑定的方法很重要。此代码将失败,

World worldInstance;
// fill the Vector in worldInstance with elements...
auto element = worldInstance[0];

试图复制std::unique_ptr<Tile>对象。std::unique_ptr是一种仅移动类型,因此编译器抱怨已删除的成员函数(复制构造函数)。取而代之的是捕获返回值作为参考,

auto& element = worldInstance[0];

或直接检索

对Pointee的引用
Tile& element = *worldInstance[0];