Avviso C26417
Il parametro del puntatore condiviso viene passato per riferimento e non reimpostato o riassegnato. In alternativa, usare T* o T& .
Linee guida di base di C++: R.35: prendere un shared_ptr<widget>& parametro per esprimere che una funzione potrebbe eseguire di nuovo il puntatore condiviso
Il passaggio di puntatori condivisi per riferimento può essere utile negli scenari in cui il codice aggiorna la destinazione dell'oggetto puntatore intelligente e il chiamante prevede di visualizzare tali aggiornamenti. L'uso di un riferimento esclusivamente per ridurre i costi di passaggio di un puntatore condiviso è discutibile. Se chiamato codice accede solo all'oggetto di destinazione e non ne gestisce mai la durata, è più sicuro passare un puntatore o un riferimento non elaborato, anziché esporre i dettagli di gestione delle risorse.
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.
L'azione di reimpostazione o riassegnazione viene interpretata in modo più generico:
qualsiasi chiamata a una funzione non costante su un puntatore condiviso può potenzialmente reimpostare il puntatore;
qualsiasi chiamata a una funzione che accetta un riferimento a un puntatore condiviso non costante può potenzialmente reimpostare o riassegnare tale puntatore.
Esempi
complicazione dell'interfaccia non necessaria
bool unregister(std::shared_ptr<event> &e) // C26417, also C26415 SMART_PTR_NOT_NEEDED
{
return e && events_.erase(e->id());
}
void renew(std::shared_ptr<event> &e)
{
if (unregister(e))
e = std::make_shared<event>(e->id());
// ...
}
complicazione dell'interfaccia non necessaria - semplificata
bool unregister(const event *e)
{
return e && events_.erase(e->id());
}
void renew(std::shared_ptr<event> &e)
{
if (unregister(e.get()))
e = std::make_shared<event>(e->id());
// ...
}