警告 C26418
共享指针参数不会复制或移动。 请改用 T* 或 T&。
C++ Core Guidelines:R.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();
}