题 `const shared_ptr `和`shared_ptr `之间的区别?


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

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

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

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


80
2017-07-22 17:05


起源


这正是你所说的。您可以查看运营商的文档 * 和 -> 确认一下。 - syam
有什么区别 T *const 和 T const *?一样。
@ H2CO3完全没有。该 const 通常修改_precedes它,所以 T *const 是一个 const 指向 T,和 T const* 是一个指针 const  T。并且最好避免使用 const 什么都没有。 - James Kanze
@JamesKanze,这是H2CO3的观点:两者之间的区别 T *const 和 T const * 两者之间的区别是一样的 const shared_ptr<T> 和 shared_ptr<const T> - Jonathan Wakely
@JamesKanze哦,但是。 T *const 是一个指向非const的const指针 T,是的 const shared_ptr<T>。相反, T const * 是一个非const指针 const T,是的 shared_ptr<const T>。


答案:


你是对的。 shared_ptr<const T> p; 类似于 const T * p; (或者,等同地, T const * p;),即尖头物体 const 而 const shared_ptr<T> p; 类似于 T* const p; 意思就是 p 是 const。综上所述:

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_ptr 和 unique_ptr


114
2017-07-22 17:10



你还回答了我脑子里常见指针的问题(const T * vs. T * const vs. T const *)。 :)我没有提到,因为我不想要我的问题 太 广泛,这是我当前任务的相关问题。无论如何,我想我现在理解得很好。谢谢! - Dave Lillethun
我很高兴它有所帮助。我用来记住的最后一个提示 const T* p;', 'T const * p; 和 T * const p。见 * 作为一个分隔符,在什么意义上 const 是什么在同一侧 *。 - Cassio Neri
我的经验法则是 const 总是指它左侧的东西。如果左边没有任何东西,那就是右侧的东西。 - hochl


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

一般来说,即使在这里,通常的规则也适用: const 修改 先于它:in boost::shared_ptr<Bar const>Bar; 在 boost::shared_ptr<Bar> const,这是实例化( 表达 boost::shared_ptr<Bar> 这是const。


1
2017-07-22 17:24



为什么'const'会被'真实'指针忽略? - gatopeich


#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;
}

1
2017-08-17 12:37