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();
}