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_iterconst_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 的同时从迭代器字段中获取元素?的主要内容,如果未能解决你的问题,请参考以下文章

值参数的 const 正确性

函数参数中的 struct 关键字和 const 正确性

构造函数初始化列表和 const 变量

为啥很少有人输入 const 正确的代码? const 正确的代码会编译得更好/更快吗? [关闭]

使用 C 库时 C++ 中的 const 正确性

如何正确使用const(常量),define(宏)