C++ 共享指针和常量正确性

C++ 共享指针和常量正确性,c++,shared-ptr,getter,const-correctness,C++,Shared Ptr,Getter,Const Correctness,将类的常量正确性扩展到其指向成员的正确方法是什么?在示例代码中,get方法的常量版本是要创建一个引用计数器与内部成员相同的std::shared_ptr,还是从0开始重新计数 class A { std::shared_ptr< B > m_b; public: std::shared_ptr< const B > get_b( ) const { return m_b; } std::shared_ptr&l

将类的常量正确性扩展到其指向成员的正确方法是什么?在示例代码中,get方法的常量版本是要创建一个引用计数器与内部成员相同的
std::shared_ptr
,还是从
0
开始重新计数

class A
{
    std::shared_ptr< B > m_b;

public:

    std::shared_ptr< const B > get_b( ) const
    {
        return m_b;
    }

    std::shared_ptr< B > get_b( )
    {
        return m_b;
    }
}
A类
{
std::shared_ptrm_B;
公众:
std::shared_ptrget_B()const
{
返回m_b;
}
std::共享\u ptr获取\u B()
{
返回m_b;
}
}

shared_ptr
从另一个
shared_ptr
构建时,将始终保留引用计数;不安全地使用它的唯一方法是从原始指针构造:
shared\u ptr(my\u ptr.get())//不要这样做


您可能还对包装器感兴趣,它位于库基础知识TS v2中,因此可能很快就会在您的实现中提供。

可以通过使用
use\u count()
进行一些测试来推断答案

还要注意,方法分辨率可能并不完全明显:

class B {};

class A {
  std::shared_ptr<B> m_b;

public:
  A() { m_b = std::make_shared<B>(); }

  std::shared_ptr<const B> get_b() const {
    std::cout << "const" << std::endl;
    return m_b;
  }

  std::shared_ptr<B> get_b() {
    std::cout << "non const" << std::endl;
    return m_b;
  }
};

int main(int, char **) {

  A a;

  std::shared_ptr<B> b = a.get_b();

  std::cout << b.use_count() << std::endl;

  std::shared_ptr<const B> cb = a.get_b();

  std::cout << cb.use_count() << std::endl;

  const A &a_const_ref = a;

  std::shared_ptr<const B> ccb = a_const_ref.get_b();

  std::cout << ccb.use_count() << std::endl;

  return 0;
}

请你澄清一下什么是违反直觉的,你认为会有什么样的陷阱?对我来说,结果似乎非常符合逻辑且安全。人们可能会认为对
get_b()
的第二次调用解析为
const
版本。同样,第三次调用增加了同一个ref计数器,这是问题本身的答案。我的回答有点改变,我不想太强调陷阱。谢谢。这种方法毕竟是安全的。您可能还希望实现
get_const_b()
,类似于标准容器()的方法
cbegin()
cend()
non const
2
non const
3
const
4