‘ const share_ptr < T >’和‘ share_ptr < const T >’的区别?

我正在为 C + + 中的一个共享指针编写一个访问器方法,它是这样的:

class Foo {
public:
return_type getBar() const {
return m_bar;
}


private:
boost::shared_ptr<Bar> m_bar;
}

因此,为了支持 getBar()的常量,返回类型应该是 boost::shared_ptr,以防止修改它所指向的 Bar。我的 猜猜看是我想返回的 shared_ptr<const Bar>类型,而 const shared_ptr<Bar>可以阻止指针本身重新指向另一个 Bar,但允许修改它指向的 Bar... ... 然而,我不确定。如果有人能证实这一点,或者纠正我的错误,我将不胜感激。谢谢!

89842 次浏览

你说得对。shared_ptr<const T> p;类似于 const T * p;(或者相当于 T const * p;) ,也就是说,指向的物体是 const,而 const 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中,它是实例化( 表达式 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;
}

基于@Cassio Neri 的回答,我想做一个简单的演示:

#include <memory>


int main(){
std::shared_ptr<int> i = std::make_shared<int>(1);
std::shared_ptr<int const> ci;


// i = ci; // compile error
ci = i;
std::cout << *i << "\t" << *ci << std::endl; // both will be 1


*i = 2;
std::cout << *i << "\t" << *ci << std::endl; // both will be 2


i = std::make_shared<int>(3);
std::cout << *i << "\t" << *ci << std::endl; // only *i has changed


// *ci = 20; // compile error
ci = std::make_shared<int>(5);
std::cout << *i << "\t" << *ci << std::endl; // only *ci has changed


}