`const shared_ptr <T>`和`shared_ptr <const T>`之间的区别?

我正在写一个C ++的共享指针的访问器方法,如下所示:

class Foo { public: return_type getBar() const { return m_bar; } private: boost::shared_ptr<Bar> m_bar; } 

所以为了支持getBar()的const性,返回types应该是一个boost::shared_ptr ,它可以防止修改它指向的Bar 。 我的猜测shared_ptr<const Bar>是我想要返回的types,而const shared_ptr<Bar>会阻止指针本身的重新分配指向不同的Bar但允许修改它指向的Bar 。但是,我不确定。 我会很感激,如果有人知道肯定可以证实这一点,或纠正我,如果我错了。 谢谢!

你是对的。 shared_ptr<const T> p; 类似于const T * p; (或者等价于T const * p; ),也就是说,指向的对象是constconst shared_ptr<T> p; 类似于T* const p; 这意味着pconst 。 综上所述:

 shared_ptr<T> p; ---> T * p; : nothing is const const shared_ptr<T> p; ---> T * const p; : p is const shared_ptr<const T> p; ---> const T * p; <=> T const * p; : *p is const const shared_ptr<const T> p; ---> const T * const p; <=> T const * const p; : p and *p are const. 

这同样适用于weak_ptrunique_ptr

boost::shared_ptr<Bar const>阻止通过共享指针修改Bar对象。 作为返回值, boost::shared_ptr<Bar> const意味着您不能在返回的临时对象上调用非const函数; 如果它是一个真正的指针(例如Bar* const ),它将被完全忽略。

一般来说,即使在这里,通常的规则也是适用的: const修改前面的内容:在boost::shared_ptr<Bar const>Bar ; 在boost::shared_ptr<Bar> const ,它是实例化(expression式boost::shared_ptr<Bar> ,它是const。

 #Check this simple code to understand... copy-paste the below code to check on any c++11 compiler #include <memory> using namespace std; class A { public: int a = 5; }; shared_ptr<A> f1() { const shared_ptr<A> sA(new A); shared_ptr<A> sA2(new A); sA = sA2; // compile-error return sA; } shared_ptr<A> f2() { shared_ptr<const A> sA(new A); sA->a = 4; // compile-error return sA; } int main(int argc, char** argv) { f1(); f2(); return 0; }