const 正确性:如何在保持函数 const 的同时从迭代器字段中获取元素?
Posted
技术标签:
【中文标题】const 正确性:如何在保持函数 const 的同时从迭代器字段中获取元素?【英文标题】:const correctness: how to get element from an iterator field while keeping the function const? 【发布时间】:2015-03-15 23:44:06 【问题描述】:我正在实现一个类Foo
,它有一个名为m_iter
的const_iterator
。我要实现
Bar* GetBar() const;
简单的
return &(*m_iter);
但是,它会触发错误
cannot initialize return object of type 'Bar *' with an rvalue of type 'const Bar *'
我的意图是返回一个指向 Bar 的指针而不改变对象的任何内部状态(即m_iter
)。
我该怎么做?
【问题讨论】:
如果你创建函数const Bar* GetBar() const
你应该没问题。从内部返回指向可变对象的指针基本上意味着您不再是 const。考虑一下如果发生了什么事GetBar()->SomeMutationOnBar();
@Charlie 如果我只想确保Foo
的成员(即m_iter
)是不可变的并允许Bar
的用户改变其内容怎么办?
我认为如果你放松一下,你很快就会做出令人惊讶的行为。特别是如果您进入多线程代码。如果你想返回一个非常量指针,不要创建const
方法。从长期可维护性的角度来看,这仍然是一个有点危险的设计,并且可能指向设计缺陷,尽管仅用一行代码很难说。
【参考方案1】:
将您的 const_iterator
更改为 iterator
。即使你的Foo
类没有直接修改迭代器指向的Bar
对象,它仍然需要有right 来修改它,如果它想将该权限授予其他人.这就是它试图通过返回一个非常量指针来做的事情。
当然,除非您打算授予对 Bar
对象的修改访问权限。在这种情况下,将函数的返回类型更改为const Bar*
。
【讨论】:
我最终将 const_iterator 更改为迭代器。【参考方案2】:我建议提供两个函数,const
版本和非const
版本。
Bar* GetBar();
Bar const* GetBar() const;
【讨论】:
以上是关于const 正确性:如何在保持函数 const 的同时从迭代器字段中获取元素?的主要内容,如果未能解决你的问题,请参考以下文章