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限定符似乎被删除了?
我这样做错了还是有不同的方法来实现这个目标?
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)
特别是预备++ 17(当保证elision不那么重要时).