02 March 2023

C++ 核心指南目录

“Take a shared_ptr<widget>& parameter to express that a function might reseat the shared pointer”

理由

明确标明函数的重座机制。

注意

重座(reseat)指的是让引用或智能指针指向另一个不同的对象

坏例子

void ChangeWidget(std::shared_ptr<widget>& w)
{
    // This will change the callers widget
    w = std::make_shared<widget>(widget{});
}

强化

  • 警告:如果一个函数接收 shared_ptr<T> 的左值引用参数,但是在所有代码执行路径上既不赋值,也不调用 reset() 。考虑使用 T*T&
  • 警告:如果一个函数接收 unique_ptr<T> 值或常值引用,但是在所有代码路径上,不复制或移动到另一个共享指针,考虑使用 T*T&
  • 警告:如果一个函数接收 shared_ptr<T> 右值引用,考虑使用值传递。