共享指针和 const 正确性
Shared pointers and const correctness
将 class 的 const 正确性 扩展到其指定成员的正确方法是什么?在示例代码中,get 方法的常量版本是要创建一个 std::shared_ptr
,其引用计数器与内部成员 m_b
相同,还是从 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;
}
}
shared_ptr
从另一个 shared_ptr
构造时将始终保留引用计数; 不安全地使用它的唯一方法是从原始指针构造:shared_ptr<...>(my_ptr.get()) // don't do this
.
您可能还对 propagate_const
包装器感兴趣,它位于 Library Fundamentals TS v2 中,因此可能很快就会在您的实施中可用。
可以通过 use_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;
}
输出:
non const
2
non const
3
const
4
将 class 的 const 正确性 扩展到其指定成员的正确方法是什么?在示例代码中,get 方法的常量版本是要创建一个 std::shared_ptr
,其引用计数器与内部成员 m_b
相同,还是从 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;
}
}
shared_ptr
从另一个 shared_ptr
构造时将始终保留引用计数; 不安全地使用它的唯一方法是从原始指针构造:shared_ptr<...>(my_ptr.get()) // don't do this
.
您可能还对 propagate_const
包装器感兴趣,它位于 Library Fundamentals TS v2 中,因此可能很快就会在您的实施中可用。
可以通过 use_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;
}
输出:
non const
2
non const
3
const
4