Compartir vía


Advertencia C26416

La referencia rvalue pasa el parámetro de puntero compartido. Pasar por valor en su lugar.

C++ Core Guidelines: R.34: Tomar un parámetro shared_ptr<widget> para expresar que una función es propietaria de una parte

El paso de un puntero compartido por referencia rvalue rara vez es necesario. A menos que sea una implementación de la semántica de movimiento para un tipo de puntero compartido, los objetos de puntero compartidos se pueden pasar de forma segura por valor. El uso de la referencia rvalue también puede ser una indicación de que es más adecuado el puntero único, ya que la propiedad única se transfiere claramente del autor de la llamada al destinatario.

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

Optimización de constructores interrogables:

action::action(std::shared_ptr<transaction> &&t) noexcept // C26416
    : transaction_(std::move(t))
{}

action::action(std::shared_ptr<transaction> &t) noexcept  // also C26417 LVALUE_REF_SHARED_PTR
    : transaction_(t)
{}

Optimización de constructor preguntable: simplificada:

action::action(std::shared_ptr<transaction> t) noexcept
    : transaction_(std::move(t))
{}