我正在尝试从函数返回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限定符似乎被删除了?
我做错了吗?或者有其他方法可以做到这一点?
答案 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;
尤其是在c++17之前(当保证省略时,它变得不那么重要了。)