Saya menulis metode pengakses untuk penunjuk bersama di C ++ yang berjalan seperti ini:
class Foo {
public:
return_type getBar() const {
return m_bar;
}
private:
boost::shared_ptr<Bar> m_bar;
}
Jadi untuk mendukung keteguhan getBar()
jenis kembalian haruslah boost::shared_ptr
yang mencegah modifikasi dari Bar
poin itu. Dugaan saya adalah shared_ptr<const Bar>
tipe yang ingin saya kembalikan untuk melakukan itu, sedangkan const shared_ptr<Bar>
akan mencegah penugasan ulang pointer itu sendiri untuk menunjuk ke yang berbeda Bar
tetapi memungkinkan modifikasi dari Bar
yang ditunjukkannya ... Namun, saya tidak yakin. Saya akan menghargai jika seseorang yang tahu pasti bisa mengkonfirmasi ini, atau mengoreksi saya jika saya salah. Terima kasih!
c++
boost
const
shared-ptr
Dave Lillethun
sumber
sumber
*
dan->
untuk memastikannya.T *const
danT const *
? Sama.const
biasanya memodifikasi apa _precedes, jadiT *const
adalahconst
pointer keT
, danT const*
adalah pointer keconst
T
. Dan yang terbaik adalah menghindari penggunaanconst
tanpa apa pun sebelumnya.T *const
danT const *
sama dengan perbedaan antaraconst shared_ptr<T>
danshared_ptr<const T>
T *const
adalah pointer const ke non-constT
, begitu jugaconst shared_ptr<T>
. Sebaliknya,T const *
adalah penunjuk non-const keconst T
, begitu jugashared_ptr<const T>
.Jawaban:
Kamu benar.
shared_ptr<const T> p;
mirip denganconst T * p;
(atau, sama,T const * p;
), yaitu menunjuk objek adalahconst
sedangkanconst shared_ptr<T> p;
mirip denganT* const p;
yang artinyap
adalahconst
. Singkatnya:Hal yang sama berlaku untuk
weak_ptr
danunique_ptr
.sumber
const T* p;', 'T const * p;
danT * const p
. Lihat*
sebagai pemisah dalam arti apaconst
yang ada di sisi yang sama*
.const
selalu mengacu pada hal yang ada di sisi kirinya. Jika tidak ada yang ada di kiri, itu adalah benda di sisi kanan.boost::shared_ptr<Bar const>
mencegah modifikasiBar
objek melalui penunjuk bersama. Sebagai nilai yang dikembalikan, const inboost::shared_ptr<Bar> const
berarti Anda tidak dapat memanggil fungsi non-const pada fungsi sementara yang dikembalikan; jika itu untuk penunjuk nyata (misalnyaBar* const
), itu akan sepenuhnya diabaikan.Secara umum, bahkan di sini, aturan yang biasa berlaku:
const
memodifikasi apa yang mendahuluinya: inboost::shared_ptr<Bar const>
, theBar
; diboost::shared_ptr<Bar> const
, itu adalah instantiation (ekspresiboost::shared_ptr<Bar>
yang const.sumber
delete
.sumber
std::make_shared()
(sejak C ++ 14).Saya ingin demo sederhana berdasarkan jawaban @Cassio Neri:
sumber