J'écris une méthode d'accesseur pour un pointeur partagé en C ++ qui ressemble à ceci:
class Foo {
public:
return_type getBar() const {
return m_bar;
}
private:
boost::shared_ptr<Bar> m_bar;
}
Donc, pour prendre en charge la const-ness du getBar()
type de retour devrait être un boost::shared_ptr
qui empêche la modification du Bar
point vers lequel il pointe. Je suppose que shared_ptr<const Bar>
c'est le type que je veux retourner pour faire cela, alors que const shared_ptr<Bar>
cela empêcherait la réaffectation du pointeur lui-même pour pointer vers un autre Bar
mais permettrait de modifier le Bar
point vers lequel il pointe ... Cependant, je ne suis pas sûr. J'apprécierais que quelqu'un qui sait avec certitude puisse confirmer cela ou me corriger si je me trompe. Merci!
c++
boost
const
shared-ptr
Dave Lillethun
la source
la source
*
et->
le confirmer.T *const
etT const *
? Le même.const
modifie normalement ce que _précède, ainsiT *const
est unconst
pointeur versT
etT const*
est un pointeur versconst
T
. Et il vaut mieux éviter d'utiliserconst
sans rien le précédant.T *const
etT const *
est la même que la différence entreconst shared_ptr<T>
etshared_ptr<const T>
T *const
est un pointeur const vers non-constT
, il en est de mêmeconst shared_ptr<T>
. En revanche,T const *
est un pointeur non const surconst T
, il en est de mêmeshared_ptr<const T>
.Réponses:
Vous avez raison.
shared_ptr<const T> p;
est similaire àconst T * p;
(ou, de manière équivalente,T const * p;
), c'est-à-dire que l'objet pointé estconst
alors queconst shared_ptr<T> p;
est similaire àT* const p;
ce qui signifie quep
c'estconst
. En résumé:La même chose vaut pour
weak_ptr
etunique_ptr
.la source
const T* p;', 'T const * p;
etT * const p
. Voyez le*
comme un séparateur dans le sens où ce qui estconst
est ce qui est du même côté du*
.const
réfère toujours à la chose sur le côté gauche de celui-ci. Si rien n'est sur la gauche, c'est la chose sur le côté droit.boost::shared_ptr<Bar const>
empêche la modification de l'Bar
objet via le pointeur partagé. En tant que valeur de retour, le const inboost::shared_ptr<Bar> const
signifie que vous ne pouvez pas appeler une fonction non-const sur le temporaire renvoyé; s'il s'agissait d'un vrai pointeur (par exempleBar* const
), il serait complètement ignoré.En général, même ici, les règles habituelles s'appliquent:
const
modifie ce qui le précède: inboost::shared_ptr<Bar const>
, theBar
; inboost::shared_ptr<Bar> const
, c'est l'instanciation (l'expressionboost::shared_ptr<Bar>
qui est const.la source
delete
.la source
std::make_shared()
(depuis C ++ 14).J'aimerais une simple démonstration basée sur la réponse de @Cassio Neri:
la source