警告 C26417

共享指针参数通过引用传递,不会被重置或重新分配。 请改用 T* 或 T&。

C++ Core Guidelines:R.35:采用 shared_ptr<widget>& 参数来表示函数可能会重置共享指针

如果被调用的代码更新智能指针对象的目标,而且调用方期望看到此类更新,则按引用传递共享指针可能会很有用。 仅使用引用来降低传递共享指针的成本是有问题的。 如果被调用的代码仅访问目标对象且绝不管理其生存期,则相比公开资源管理详细信息,传递原始指针或引用会更安全。

备注

  • 此检查可识别 std::shared_pointer 和用户定义类型,这些类型的行为可能类似于共享指针。 用户定义共享指针应具有以下特征:

  • 重载取消引用或成员访问运算符(公共且未删除);

  • 复制构造函数或复制赋值运算符(公共且未删除);

  • 未删除或非默认的公共析构函数。 空析构函数仍算作用户定义。

  • 以更通用的方式解释重置或重新分配的操作:

  • 任何对共享指针上非常量函数的调用都可能会重置指针;

  • 任何接受引用非常量共享指针的函数的调用都可能会重置或重新分配该指针。

示例

不必要的接口复杂性

bool unregister(std::shared_ptr<event> &e) // C26417, also C26415 SMART_PTR_NOT_NEEDED
{
    return e && events_.erase(e->id());
}

void renew(std::shared_ptr<event> &e)
{
    if (unregister(e))
        e = std::make_shared<event>(e->id());
    // ...
}

不必要的接口复杂性 - 简化

bool unregister(const event *e)
{
    return e && events_.erase(e->id());
}

void renew(std::shared_ptr<event> &e)
{
    if (unregister(e.get()))
        e = std::make_shared<event>(e->id());
    // ...
}