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