C26418 NO_VALUE_OR_CONST_REF_SHARED_PTRC26418 NO_VALUE_OR_CONST_REF_SHARED_PTR

"Parámetro de puntero compartido no copiarlo o moverlo."Shared pointer parameter is not copied or moved. Usar T * o T & en su lugar. "Use T* or T& instead."

Directrices de núcleo de C++: R.36: toman una shared_ptr const& parámetro expresar que puede mantener un recuento de referencias para el objetoC++ Core Guidelines: R.36: Take a const shared_ptr& parameter to express that it might retain a reference count to the object

Si el parámetro de puntero compartido se pasa por valor o referencia a un objeto constante que se espera que función tomará el control de duración de su objeto de destino sin afectar a la del autor de la llamada.If shared pointer parameter is passed by value or reference to a constant object it is expected that function will take control of its target object’s lifetime without affecting of the caller. El código debe copiar o se mueve el parámetro de puntero compartido a otro objeto de puntero compartido o pasar más para otro código mediante la invocación de funciones que aceptan punteros compartidos.The code should either copy or move the shared pointer parameter to another shared pointer object or pass it further to other code by invoking functions which accept shared pointers. Si esto no es el caso, a continuación, puntero sin formato o una referencia puede ser factible.If this is not the case, then plain pointer or reference may be feasible.

ComentariosRemarks

  • Esta comprobación reconoce std::shared_pointer y tipos definidos por el usuario que están probables que se comportan como punteros compartidos.This check recognizes std::shared_pointer and user-defined types which are likely to behave like shared pointers. Para los punteros compartidos definidos por el usuario se esperan que las siguientes características:The following traits are expected for user-defined shared pointers:
  • sobrecarga de desreferenciación o de acceso a miembros de operadores (públicos y no se han eliminado);overloaded dereference or member access operators (public and non-deleted);
  • constructor de copias o el operador de asignación de copia (público y no se han eliminado);copy constructor or copy assignment operator (public and non-deleted);
  • destructor público que no se eliminan ni su valor predeterminado.public destructor which is neither deleted nor defaulted. Destructores vacíos todavía se cuentan como definido por el usuario.Empty destructors are still counted as user-defined.

EjemploExample

complicación innecesarios de la interfazunnecessary interface complication

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

EjemploExample

complicación innecesarios de la interfaz - simplificadounnecessary interface complication - simplified

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