Возврат константы из неконстантной функции

У меня есть класс, в котором получение определенного члена по ссылке включает в себя логику, поэтому я создал для него частную функцию получения, которая прекрасно работает внутри.

Я также хотел бы предоставить публичный доступ к той же ссылке, но с постоянным модификатором. Поскольку открытая функция не должна изменять состояние класса, она объявляется с ключевым словом 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;
    }
};

Всего 1 ответ


Некоторые люди Вы можете сделать это так, если вы знаете о предостережениях:

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 ссылки и указатели в порядке, если они прослеживаются до неконстантного объекта.)


Есть идеи?

10000