警告 C26416

共享指针参数通过 rvalue 引用传递。 请改为通过值传递。

C++ Core Guidelines:R.34:采用 shared_ptr<widget> 参数来表示函数是部件所有者

很少需要通过 rvalue 引用传递共享指针。 除非是共享指针类型本身移动语义的实现,否则可以安全通过值传递共享指针对象。 使用 rvalue 引用也可能指示唯一指针更合适,因为它清楚地将唯一所有权从调用方转移到被调用方。

注解

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

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

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

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

示例

可疑构造函数优化:

action::action(std::shared_ptr<transaction> &&t) noexcept // C26416
    : transaction_(std::move(t))
{}

action::action(std::shared_ptr<transaction> &t) noexcept  // also C26417 LVALUE_REF_SHARED_PTR
    : transaction_(t)
{}

可疑构造函数优化 - 简化:

action::action(std::shared_ptr<transaction> t) noexcept
    : transaction_(std::move(t))
{}