Piszę metodę akcesora dla współdzielonego wskaźnika w C ++, która wygląda mniej więcej tak:
class Foo {
public:
return_type getBar() const {
return m_bar;
}
private:
boost::shared_ptr<Bar> m_bar;
}
Tak więc, aby obsługiwać stałą getBar()
zwracanego typu, powinno być a, boost::shared_ptr
które zapobiega modyfikacji wskazanego przez Bar
niego. Moje przypuszczenie jest to, że shared_ptr<const Bar>
jest to rodzaj chcę wrócić do tego, natomiast const shared_ptr<Bar>
uniemożliwia zmiany przeznaczenia wskaźnik się do punktu do innego Bar
, ale umożliwiają modyfikację Bar
że wskazuje ... Jednak nie jestem pewien. Byłbym wdzięczny, gdyby ktoś, kto wie na pewno, mógł to potwierdzić lub poprawić mnie, jeśli źle zrozumiałem. Dzięki!
c++
boost
const
shared-ptr
Dave Lillethun
źródło
źródło
*
i->
to potwierdzić.T *const
iT const *
? To samo.const
zazwyczaj modyfikuje co _precedes, więcT *const
jestconst
wskaźnikT
iT const*
jest wskaźnikiemconst
T
. I najlepiej unikać używania,const
gdy nic go nie poprzedza.T *const
iT const *
jest taka sama jak różnica międzyconst shared_ptr<T>
ishared_ptr<const T>
T *const
jest wskaźnikiem stałej do wartości innej niż stałaT
, tak jestconst shared_ptr<T>
. W przeciwieństwieT const *
doconst T
tego jest wskaźnikiem , który nie jest stałą , tak jestshared_ptr<const T>
.Odpowiedzi:
Masz rację.
shared_ptr<const T> p;
jest podobny doconst T * p;
(lub równoważnieT const * p;
), to znaczy wskazany obiekt jest,const
podczas gdyconst shared_ptr<T> p;
jest podobny,T* const p;
co oznacza, żep
jestconst
. W podsumowaniu:To samo dotyczy
weak_ptr
iunique_ptr
.źródło
const T* p;', 'T const * p;
iT * const p
. Postrzegaj*
jako separator w tym sensie, że to, co jest,const
znajduje się po tej samej stronie*
.const
zawsze odnosi się do rzeczy po lewej stronie. Jeśli nic nie jest po lewej stronie, to jest to po prawej stronie.boost::shared_ptr<Bar const>
zapobiega modyfikacjiBar
obiektu za pomocą udostępnionego wskaźnika. Jako wartość zwracana, stała wboost::shared_ptr<Bar> const
oznacza, że nie można wywołać funkcji innej niż stała na zwróconym obiekcie tymczasowym; gdyby dotyczył prawdziwego wskaźnika (np.Bar* const
), zostałby całkowicie zignorowany.Generalnie nawet tutaj obowiązują zwykłe reguły:
const
modyfikuje to, co go poprzedza: inboost::shared_ptr<Bar const>
, theBar
; wboost::shared_ptr<Bar> const
, jest to instancja (wyrażenie,boost::shared_ptr<Bar>
które jest stałą.źródło
delete
zrobić.źródło
std::make_shared()
(od C ++ 14).Chciałbym przeprowadzić prostą demonstrację opartą na odpowiedzi @Cassio Neri:
źródło