警告 C26418

共享指针参数不会复制或移动。 请改用 T* 或 T&。

C++ Core GuidelinesR.36:采用 const shared_ptr <小组件>参数来表示它可能会保留对对象的引用计数

如果共享指针参数由值或引用传递给常数对象,则函数应控制目标对象的生存期,而不会影响调用方。 代码应复制或将共享指针参数移动到另一个共享指针对象,或通过调用接受共享指针的函数将其传递给其他代码。 否则,纯指针或引用可能可行。

注解

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

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

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

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

示例

不必要的接口复杂性

template<class T>
std::string to_string(const std::shared_ptr<T> &e) // C26418, also C26415 SMART_PTR_NOT_NEEDED
{
    return !e ? null_string : e->to_string();
}

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

template<class T>
std::string to_string(const T *e)
{
    return !e ? null_string : e->to_string();
}