Понимание const_cast в C ++ - PullRequest
1 голос
/ 19 июня 2019

Я пытаюсь понять const_cast.

В приведенном ниже примере items_ является закрытой переменной-членом.

Метод getItems() является методом const, что означает, что он не может изменять переменную-член items_.

getItems() возвращает ссылку const vector, что означает, что вы не можете изменить переменную-член items_.

У меня вопрос, нужно ли здесь const_cast? Я так не думаю, потому что мне не нужно отбрасывать постоянство?

#include <iostream>

class test {  
  std::vector<Item> items_;
public:
  const std::vector<Item>& getItems() const;
};

const std::vector<mv::Item>& mv::Workloads::getItems() const
{
  return const_cast<std::vector<Item>&>(items_);
}

Ответы [ 2 ]

5 голосов
/ 19 июня 2019

Это не только не нужно, но и неправильно в этом месте.

Рассмотрим, что происходит, когда вы удаляете const из возвращаемого типа:

/*const*/ std::vector<mv::Item>& mv::Workloads::getItems() const
{
return const_cast<std::vector<Item>&>(items_);
}

Теперь метод возвращает неконстантную ссылку на const объект! Обратите внимание, что сам метод объявлен как const, следовательно, this равен const в контексте этого метода, а также items_ равен const. Использование ссылки, возвращаемой этим методом, приведет к неопределенному поведению при вызове метода в экземпляре const test.

В этом смысле единственный эффект const_cast здесь заключается в том, чтобы потенциально заглушить важную ошибку компилятора, если вы когда-нибудь решите изменить тип возвращаемого значения.

С другой стороны, в методе как есть (т.е. возвращающем ссылку const) нет причины для приведения. items_ равно const и возвращается ссылка const на него.

const_cast полезно, например, чтобы избежать дублирования кода для const и не-1027 * методов, когда вы точно знаете, что отбрасываемый вами const объект действительно не const, см. здесь для деталей.

PS : если вы действительно хотите вернуть изменяемую ссылку на член из метода const, вы должны объявить член mutable. Кроме того, тогда const_cast не потребуется. Тем не менее, mutable следует использовать с осторожностью и, как правило, в первую очередь не требуется.

3 голосов
/ 19 июня 2019

Это не обязательно, просто верните _items.

Функции-члены Const видят сам объект (*this) как const, поэтому каждый элемент данных рассматривается как const, из которого разрешено построение и возврат ссылки на const.

#include <iostream>
using namespace std;
class test {

std::vector<Item> items_;
public:
const std::vector<Item>& getItems() const;
};
const std::vector<mv::Item>& mv::Workloads::getItems() const
{
return items_;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...