【问题标题】:Can I provide a const reference to a caller without returning it?我可以在不返回调用者的情况下提供对调用者的 const 引用吗?
【发布时间】:2022-01-04 20:14:48
【问题描述】:

我想在概念上做这样的事情。

enum class Status {
  READY,
  NOT_READY
};

class Foo {
public:
  Status get_foo(const ExpensiveToCopyType& f) {
    if (is_ready) {
      f = m_foo;
      return Status::READY;
    } else {
      return Status::NOT_READY;
    }
  }
private:
  bool is_ready;
  ExpensiveToCopyType m_foo;
}

重要的部分是我希望能够为调用者提供m_foo 的只读句柄,并指示它是否处于有效状态。它会一直存在,但它可能会或可能不会处于从调用者的上下文中有效的状态。例如考虑将其绘制到屏幕上,如果它“未准备好”但不会导致无效访问,则可能会产生视觉伪影。

表面上这可以通过std::shared_ptr 或类似的方式完成,但我想知道是否可以通过引用来实现。

【问题讨论】:

  • 听起来你可以只返回一个常规的 const 指针,或者如果状态没有按照约定准备好,则返回 nullptr
  • 为什么“不退货”很重要?返回状态和句柄的组合状态是不可接受的吗?
  • 参考不可重新安装。这是它的主要好处。您需要可复制或可分配的东西,例如原始指针、智能指针或 std::reference_wrapper。
  • @user17732522 这是一种完全有效的方法,我希望只是保持干净的约定。整个系统使用这些状态代码向调用者指示状态,我不想对返回类型进行一次性案例。
  • 最简单的方法似乎是返回一个指针,如果对象不处于有效状态,则返回一个nullptr

标签: c++ reference


【解决方案1】:

我可以向调用者提供一个常量引用而不返回它吗?

不,你不能。您可以提供一个指针。

但是,我建议将引用(或者更确切地说,指针)和有效性一起返回。如果在无效的情况下引用无效,那么一个简单的解决方案是只返回一个指针;如果状态无效,则为 null。

【讨论】:

    猜你喜欢
    • 2020-12-04
    • 2019-03-07
    • 2023-03-10
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-15
    相关资源
    最近更新 更多