【问题标题】:const correctness: how to get element from an iterator field while keeping the function const?const 正确性:如何在保持函数 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 方法。从长期可维护性的角度来看,这仍然是一个有点危险的设计,并且可能指向设计缺陷,尽管仅用一行代码很难说。

标签: c++ const-correctness


【解决方案1】:

将您的 const_iterator 更改为 iterator。即使你的Foo 类没有直接修改迭代器指向的Bar 对象,它仍然需要有right 来修改它,如果它想将该权限授予其他人.这就是它试图通过返回一个非常量指针来做的事情。

当然,除非您打算授予对 Bar 对象的修改访问权限。在这种情况下,将函数的返回类型更改为const Bar*

【讨论】:

  • 我最终将 const_iterator 更改为迭代器。
【解决方案2】:

我建议提供两个函数,const 版本和非const 版本。

Bar* GetBar();
Bar const* GetBar() const;

【讨论】:

    猜你喜欢
    • 2015-08-23
    • 2022-08-09
    • 1970-01-01
    • 1970-01-01
    • 2016-06-25
    • 2017-01-07
    • 2020-11-28
    • 1970-01-01
    • 2011-10-23
    相关资源
    最近更新 更多