Return 来自非常量函数的常量引用 return 引用值

Return constant reference from non-const function return reference value

我有一个class,其中通过引用获取某个成员涉及一个逻辑,所以我为它创建了一个私有getter函数,它在内部运行良好。

我还想提供 public 对同一引用的访问权限,但要使用常量修饰符。 由于 public 函数不应修改 class 的状态,因此使用 const 关键字进行声明。 但是内部逻辑,因为它通过设计提供对内部成员的引用,所以不应该声明为 const。

我如何才能使用相同的逻辑来获取引用,并为它提供常量和非常量访问点?

这里有我遗漏的模式吗?

下面我编了个小例子来演示:

class my_class{
public:

  const int& get_my_field() const{
    return get_my_field_ref(); //g++: error: error - passing 'const my_class' as 'this' argument discards qualifiers [-fpermissive]
  }

private:
    int field;

    int& get_my_field_ref(){ //g++: warning: note - in call to 'int& my_class::get_my_field_ref()'
      /* ..complex logic to get reference.. */
      return field;
    }
};

有些人你可以这样做,只要你知道注意事项:

int& get_my_field_ref(){'
  /* ..complex logic to get reference.. */
  return field;
}
const int& get_my_field_ref() const {
  return const_cast<my_class&>(*this).get_my_field_ref();
}

请注意,尽管 const 成员函数或多或少地保证了它可以在不引起数据竞争的情况下使用(a.k.a。它是线程安全的)。您应该将 complex logic 实现为线程安全的。

此外,请确保永远不要对已定义的对象调用您的函数 const。 (const 引用和指针是可以的,只要它们追溯到一个非常量对象。)

想通了,问题多出在设计上。

示例程序没有提到的是 "complex logic" 是获取数组内的索引。因此,考虑到这些信息,可以分离计算索引的逻辑,并在 const 和非 const 接口中使用。

#include <iostream>

using namespace std;


class my_class{
public:

  const int& get_my_field() const{
    return field[complex_logic_to_get_reference()];
  }

private:
    int field[5];

    int complex_logic_to_get_reference() const{
      int result_index = 0;
      /* Complex logic to get reference */
      return result_index;
    }

    int& get_my_field_ref(int index){
      return field[complex_logic_to_get_reference()];
    }
};

int main(int argc, char *argv[])
{
    return 0;
}

对于@j6t 和@Peter 在发布问题时遗漏了这些信息,我深表歉意,这个概念现在真的很流行。