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

jjm*_*mcc 1 c++ const pass-by-reference

我试图从函数返回一个const对象,以便我可以从中获取信息,但一旦创建它就不能改变.我有以下代码

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


    std::unique_ptr<Sprite> m_sprite;
    int test = 5;
Run Code Online (Sandbox Code Playgroud)

代码中的其他地方我正在调用此GetSprite函数

Sprite sprite = entity->GetSprite();
sprite.test = 6;
Run Code Online (Sandbox Code Playgroud)

这似乎编译得很好,并且在单步执行之后test实际上已经改变了.我会假设从返回的对象GetSprite不允许我修改对象,但const限定符似乎被删除了?

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

Yak*_*ont 6

Sprite sprite = entity->GetSprite();
Run Code Online (Sandbox Code Playgroud)

这将使用`Sprite的copy-consturctor 创建Sprite对象GetSprite返回的副本.

编辑副本不应该导致原件被修改,除非您Sprite写错了,或者您在引用,值和指针语义之间感到困惑.

Sprite const& sprite = entity->GetSprite();
Run Code Online (Sandbox Code Playgroud)

这将获得对包含的引用Sprite,您无法通过它来修改它.

如果要阻止复制Sprites,可以执行以下操作:

Sprite(Sprite const&) = delete;
Run Code Online (Sandbox Code Playgroud)

但我建议允许移动Sprites:

Sprite(Sprite&&) = default;
Run Code Online (Sandbox Code Playgroud)

特别是预备(当保证elision不那么重要时).