从非常量函数返回常量引用返回值

时间:2020-03-26 10:47:45

标签: c++ reference const-correctness

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

我还想提供对同一参考的公开访问,但要使用常量修饰符。 由于公共函数不应修改类的状态,因此可以使用const关键字进行声明。 但是,内部逻辑由于设计上提供了对内部成员的引用,因此不应将其声明为const。

我如何能够使用相同的逻辑来获取引用,并为其提供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;
    }
};

2 个答案:

答案 0 :(得分:0)

某些人只要知道这些警告,就可以这样做:

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成员函数或多或少保证了它可以在不引起数据争用的情况下使用(也就是它是线程安全的)。您应该将complex logic实现为线程安全的。

此外,请确保永远不要在已定义const的对象上调用函数。 (const只要可以追溯到非常量对象,就可以使用引用和指针。)

答案 1 :(得分:0)

经过深思熟虑,问题主要出在设计上。

示例程序未能提及的是“复杂逻辑”是要在数组内获取索引。因此,考虑到此信息,可以将计算索引的逻辑分开,并在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道歉,因为他们在发布问题时将这些信息遗漏了,这个概念现在才被点击。