如何从C ++函数正确返回不可修改的对象引用?

时间:2018-12-12 18:21:38

标签: c++ const pass-by-reference

我正在尝试从函数返回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返回的对象不允许我修改该对象,但是const限定符似乎被删除了?

我做错了吗?或者有其他方法可以做到这一点?

1 个答案:

答案 0 :(得分:6)

Sprite sprite = entity->GetSprite();

这会使用Sprite的副本构造函数创建Sprite对象GetSprite返回的副本。

除非您错误地写了Sprite,否则在引用,值和指针语义之间感到困惑的情况下,编辑副本不会导致原始文档被修改。

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

这将获得对包含的Sprite的引用,您无法通过该引用进行修改。

如果您想阻止Sprite的复制,可以执行以下操作:

Sprite(Sprite const&) = delete;

但是我建议允许移动Sprite s:

Sprite(Sprite&&) = default;

尤其是在之前(当保证省略时,它变得不那么重要了。)