Avviso C26418
Il parametro del puntatore condiviso non viene copiato o spostato. In alternativa, usare T* o T& .
Linee guida di base di C++: R.36: Prendere un parametro const shared_ptr<widget>& per esprimere che potrebbe mantenere un conteggio dei riferimenti all'oggetto
Se un parametro puntatore condiviso viene passato per valore o per riferimento a un oggetto costante, la funzione deve assumere il controllo della durata dell'oggetto di destinazione senza influire sul chiamante. Il codice deve copiare o spostare il parametro del puntatore condiviso in un altro oggetto puntatore condiviso oppure passarlo ad altro codice richiamando funzioni che accettano puntatori condivisi. In caso contrario, un puntatore o un riferimento normale può essere fattibile.
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
complicazione dell'interfaccia non necessaria
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();
}
complicazione dell'interfaccia non necessaria - semplificata
template<class T>
std::string to_string(const T *e)
{
return !e ? null_string : e->to_string();
}