我如何正确 return 来自 C++ 函数的不可修改的对象引用?

How do I correctly return an unmodifiable object reference from function in C++?

我正在尝试从一个函数中 return 一个 const 对象,以便我可以从中获取信息,但是一旦创建就无法更改任何内容。我有以下代码

    Sprite const& GetSprite() const {
        return *m_sprite;
    }


    std::unique_ptr<Sprite> m_sprite;
    int test = 5;

我在代码的其他地方调用这个 GetSprite 函数

Sprite sprite = entity->GetSprite();
sprite.test = 6;

这似乎可以正常编译,并且在逐步执行 test 中的值后实际上发生了变化。我本以为从 GetSprite 编辑的对象 return 不允许我修改该对象,但是 const 限定符似乎被删除了?

我是不是做错了,还是有不同的方法来实现这个?

Sprite sprite = entity->GetSprite();

这会创建 Sprite 对象 GetSprite returns 的副本,使用 `Sprite 的复制构造函数。

编辑副本不应导致修改原件,除非您写错了Sprite,或者您混淆了引用、值和指针语义。

Sprite const& sprite = entity->GetSprite();

这会获取对包含的 Sprite 的引用,您不能通过它修改它。

如果你想阻止复制 Sprites,你可以这样做:

Sprite(Sprite const&) = delete;

但我建议允许移动 Sprites:

Sprite(Sprite&&) = default;

尤其是 之前(当保证省略使其不那么重要时)。