const shared_ptr 和 shared_ptr 在 C++ 中表示两种不同的概念,尽管它们都与智能指针和常量性有关。下面是它们之间的主要区别:
const shared_ptr
当你声明一个 const shared_ptr,你实际上是在声明一个指向 int 的智能指针,而这个智能指针本身是不可变的。这意味着你不能改变这个智能指针所指向的对象(即你不能使其指向另一个对象),但你可以修改它所指向的 int 对象的值(除非该对象本身是常量)。
const std::shared_ptr<int> ptr = std::make_shared<int>(42); // 正确:修改 ptr 所指向的 int 的值
*ptr = 100; // 错误:不能改变 ptr 所指向的对象
// ptr = std::make_shared<int>(50); // 编译错误
shared_ptr
当你声明一个 shared_ptr,你声明了一个智能指针,它指向一个 const int 对象。这意味着你不能通过这个智能指针来修改它所指向的 int 对象的值,但你可以改变这个智能指针所指向的对象(即你可以使其指向另一个 const int)。
std::shared_ptr<const int> ptr = std::make_shared<const int>(42); // 错误:不能修改 ptr 所指向的 const int 的值
// *ptr = 100; // 编译错误 // 正确:可以改变 ptr 所指向的对象(虽然这在实践中可能并不常见)
ptr = std::make_shared<const int>(50);
总结:
const shared_ptr:智能指针本身不可变,但可以修改所指向的 int 对象的值。
shared_ptr:智能指针可以变(可以指向其他对象),但所指向的 int 对象本身不可变。
在实际编程中,选择使用哪种类型取决于你的需求:如果你希望智能指针本身不可变,使用 const shared_ptr;如果你希望智能指针所指向的对象不可变,使用 shared_ptr。通常,保护数据不被修改是一个好的编程实践,因此 shared_ptr 在许多情况下可能更有用。