Ich schreibe eine Zugriffsmethode für einen gemeinsam genutzten Zeiger in C ++, die ungefähr so aussieht:
class Foo {
public:
return_type getBar() const {
return m_bar;
}
private:
boost::shared_ptr<Bar> m_bar;
}
Um die Konstanz des getBar()
Rückgabetyps zu unterstützen, sollte ein Wert verwendet werden boost::shared_ptr
, der eine Änderung des Zeigertyps verhindert Bar
. Ich vermute, dass dies shared_ptr<const Bar>
der Typ ist, zu dem ich zurückkehren möchte, während const shared_ptr<Bar>
dies eine Neuzuweisung des Zeigers selbst verhindern würde, um auf einen anderen zu zeigen, Bar
aber eine Änderung des Zeigers zulässt, auf den Bar
er zeigt ... Ich bin mir jedoch nicht sicher. Ich würde es begrüßen, wenn jemand, der es genau weiß, dies entweder bestätigen oder mich korrigieren könnte, wenn ich etwas falsch gemacht hätte. Vielen Dank!
c++
boost
const
shared-ptr
Dave Lillethun
quelle
quelle
*
und dies->
bestätigen.T *const
undT const *
? Das Gleiche.const
ändert normalerweise, was _preced es ist,T *const
ist also einconst
Zeiger aufT
undT const*
ist ein Zeiger aufconst
T
. Und es ist am besten zu vermeiden,const
mit nichts davor zu verwenden.T *const
undT const *
ist der gleiche wie der Unterschied zwischenconst shared_ptr<T>
undshared_ptr<const T>
T *const
ein const Zeiger auf nicht-const istT
, so istconst shared_ptr<T>
. Im Gegensatz dazuT const *
ist eine nicht-const Zeiger aufconst T
, so istshared_ptr<const T>
.Antworten:
Du hast recht.
shared_ptr<const T> p;
ist ähnlichconst T * p;
(oder gleichwertigT const * p;
), das heißt, das spitze Objekt ist,const
währendconst shared_ptr<T> p;
es ähnlich ist,T* const p;
was bedeutet, dass dasp
heißtconst
. Zusammenfassend:Gleiches gilt für
weak_ptr
undunique_ptr
.quelle
const T* p;', 'T const * p;
und an den ich mich erinnereT * const p
. Sehen Sie das*
als Trennzeichen in dem Sinne, dass das, was ist, dasconst
ist, was sich auf derselben Seite des befindet*
.const
immer auf das Ding auf der linken Seite bezieht. Wenn links nichts ist, ist es das Ding auf der rechten Seite.boost::shared_ptr<Bar const>
verhindert die Änderung desBar
Objekts durch den gemeinsam genutzten Zeiger. Als Rückgabewertboost::shared_ptr<Bar> const
bedeutet const in , dass Sie für das zurückgegebene temporäre Element keine Nicht-const-Funktion aufrufen können. wenn es für einen echten Zeiger wäre (zBar* const
), würde er vollständig ignoriert.Im Allgemeinen gelten auch hier die üblichen Regeln:
const
Ändert, was davor steht: inboost::shared_ptr<Bar const>
, theBar
; inboost::shared_ptr<Bar> const
ist es die Instanziierung (der Ausdruck,boost::shared_ptr<Bar>
der const ist.quelle
delete
es.quelle
std::make_shared()
(seit C ++ 14) vorschlagen .Ich möchte eine einfache Demostration basierend auf der Antwort von @Cassio Neri:
quelle