为什么 const shared_ptr<const T>& 和 const shared_ptr<T>& 显示不同的引用计数?

Why do const shared_ptr<const T>& and const shared_ptr<T>& show different reference counts?

对于以下代码片段,它显示了方法中的不同引用计数。有人可以解释为什么这些值不同吗?

class Foo {
};

void f1( const std::shared_ptr<Foo>& ptr ) {
   std::cout << "f1(): counts: " << ptr.use_count() << std::endl;
}

void f2( const std::shared_ptr<const Foo>& ptr ) {
   std::cout << "f2(): counts: " << ptr.use_count() << std::endl;
}

int main() {
   std::shared_ptr<Foo> ptr( new Foo );
   std::cout << "main(): counts: " << ptr.use_count() << std::endl;

   f1( ptr );
   f2( ptr );

   std::cout << "main(): counts: " << ptr.use_count() << std::endl;

   return 0;
}

对应输出:

main(): counts: 1
f1(): counts: 1
f2(): counts: 2
main(): counts: 1

请注意 std::shared_ptr<Foo>std::shared_ptr<const Foo> 是不同的类型(即具有不同模板类型参数的 class 模板实例化是不同的类型)。

当您将ptr(即std::shared_ptr<Foo>)传递给f2时,它不能直接绑定到对std::shared_ptr<const Foo>的引用;必须构造一个临时 std::shared_ptr<const Foo>,然后绑定到参数 ptr。构造的 shared_ptr 与原始 shared_ptr 共享所有权,因此 use_count 在 f2() 中增加到 2

临时文件会在f2( ptr );结束时销毁;然后 use_count 减少到 1.