Я пишу метод доступа для общего указателя на C ++, который выглядит примерно так:
class Foo {
public:
return_type getBar() const {
return m_bar;
}
private:
boost::shared_ptr<Bar> m_bar;
}
Таким образом, для поддержки константности getBar()
возвращаемого типа должен быть объект boost::shared_ptr
, предотвращающий изменение того, на что Bar
он указывает. Я предполагаю , что shared_ptr<const Bar>
это тот тип, который я хочу вернуть, чтобы сделать это, тогда как const shared_ptr<Bar>
это предотвратит переназначение самого указателя, чтобы он указывал на другой, Bar
но разрешил изменение того, на Bar
что он указывает ... Однако я не уверен. Буду признателен, если кто-то, кто знает наверняка, подтвердит это или поправит меня, если я ошибся. Спасибо!
c++
boost
const
shared-ptr
Дэйв Лиллетан
источник
источник
*
и->
в этом убедиться.T *const
иT const *
? Такой же.const
обычно модифицирует , что _precedes, поэтомуT *const
являетсяconst
указателемT
, иT const*
является указателемconst
T
. И лучше избегать использования, если емуconst
ничего не предшествует.T *const
иT const *
такая же, как и разница междуconst shared_ptr<T>
иshared_ptr<const T>
T *const
константный указатель на неконстантныйT
, так и естьconst shared_ptr<T>
. В отличии от этого ,T const *
не является константным указателем наconst T
, такshared_ptr<const T>
.Ответы:
Ты прав.
shared_ptr<const T> p;
похож наconst T * p;
(или, что то же самое,T const * p;
), то есть заостренный объект подобенconst
тогдаconst shared_ptr<T> p;
как подобен,T* const p;
что означает, чтоp
естьconst
. В итоге:То же самое
weak_ptr
и для иunique_ptr
.источник
const T* p;', 'T const * p;
иT * const p
. Рассматривайте*
как разделитель в том смысле, что то, что есть,const
находится на той же стороне*
.const
всегда относится к предмету слева от него. Если слева ничего нет, значит, это вещь справа.boost::shared_ptr<Bar const>
предотвращает изменениеBar
объекта через общий указатель. В качестве возвращаемого значения константа inboost::shared_ptr<Bar> const
означает, что вы не можете вызвать неконстантную функцию для возвращаемой временной; если бы это был реальный указатель (напримерBar* const
), он был бы полностью проигнорирован.В общем, даже здесь действуют обычные правила:
const
изменяет то, что ему предшествует: inboost::shared_ptr<Bar const>
, theBar
; inboost::shared_ptr<Bar> const
, это экземпляр (выражениеboost::shared_ptr<Bar>
const.источник
delete
.источник
std::make_shared()
(начиная с C ++ 14).Я хотел бы провести простую демонстрацию на основе ответа @Cassio Neri:
источник