Advertencia C26418
El parámetro de puntero compartido no se copia ni se mueve. Use T* o T& en su lugar.
Directrices básicas de C++: R.36: Tomar un shared_ptr widget> y parámetro const<para expresar que podría conservar un recuento de referencias para el objeto
Si un parámetro de puntero compartido se pasa por valor o por referencia a un objeto constante, se espera que la función tome el control de la duración del objeto de destino sin afectar al autor de la llamada. El código debe copiar o mover el parámetro de puntero compartido a otro objeto de puntero compartido o pasarlo a otro código invocando funciones que aceptan punteros compartidos. De lo contrario, un puntero o referencia sin formato puede ser factible.
Comentarios
Esta comprobación reconoce
std::shared_pointer
y los tipos definidos por el usuario que probablemente se comporten como punteros compartidos. En los punteros compartidos definidos por el usuario se esperan los rasgos siguientes:operadores de acceso a miembros o de desreferencia sobrecargados (públicos y no eliminados);
un constructor de copia o un operador de asignación de copia (público y no eliminado);
Un destructor público que no esté eliminado o sea el predeterminado. Los destructores vacíos todavía cuentan como definidos por el usuario.
Ejemplos
complicación innecesaria de la interfaz
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();
}
complicación innecesaria de la interfaz: simplificado
template<class T>
std::string to_string(const T *e)
{
return !e ? null_string : e->to_string();
}