Condividi tramite


Avviso C26416

Il parametro puntatore condiviso viene passato dal riferimento rvalue. Passare invece il valore .

Linee guida di base di C++: R.34: Usare un parametro widget> shared_ptr<per esprimere che una funzione è parte del proprietario

Il passaggio di un puntatore condiviso per riferimento rvalue è raramente necessario. A meno che non si tratti di un'implementazione della semantica di spostamento per un tipo di puntatore condiviso stesso, gli oggetti puntatore condivisi possono essere passati in modo sicuro per valore. L'uso del riferimento rvalue può anche essere un'indicazione che il puntatore univoco è più appropriato perché trasferisce chiaramente la proprietà univoca dal chiamante al chiamato.

Osservazioni:

  • Questo controllo riconosce e tipi std::shared_pointer definiti dall'utente che probabilmente si comportano come puntatori condivisi. Per i puntatori condivisi definiti dall'utente sono previsti i tratti seguenti:

  • dereferenziazione o operatori di accesso ai membri di overload (pubblico e non eliminato);

  • un costruttore di copia o un operatore di assegnazione di copia (pubblico e non eliminato);

  • distruttore pubblico non eliminato o predefinito. I distruttori vuoti vengono comunque conteggiati come definiti dall'utente.

Esempi

Ottimizzazione del costruttore discutibile:

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)
{}

Ottimizzazione del costruttore discutibile - semplificata:

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