Const с умными указателями в C ++ - PullRequest
1 голос
/ 26 октября 2011

Я пишу реализацию интеллектуального указателя в C ++, и у меня возникли некоторые проблемы с правильностью const. Ниже приводится выдержка из кода:

template <class T> class Pointer {
  T* pointee;

public:  

  Pointer(const Pointer<T>& other) { // must be const Pointer& for assignments
    pointee = other.getPointee();
  }

  T* getPointee() const {
    return pointee;
  }
};

Это один из способов сделать это, однако мне неловко, что член const не возвращает указатель const. Другой возможностью было бы позволить getPointee() вернуть const T* и выполнить const_cast<T*> в конструкторе копирования.

Есть ли лучший способ сделать это? Если нет, что, по вашему мнению, является меньшим злом, возвращение неконстантного или совершение const_cast?

Ответы [ 2 ]

7 голосов
/ 26 октября 2011

Лучше всего рассматривать ваш постоянный умный указатель как постоянный указатель на непостоянный объект. Это похоже на:

int * const int_ptr;

Если вам нужен указатель на постоянный объект:

Pointer<const int> const_int_smart_ptr;

, что в основном эквивалентно:

const int *const_int_ptr;
4 голосов
/ 26 октября 2011

Объект, обозначенный pointee, по-видимому, не принадлежит Pointer, так что я не вижу причин предполагать, что вызов функции const Pointer вернет T const*, а не T*. (Если указываемые на объект были концептуально частью Pointer, конечно же, вопрос был бы другой.)

...