Condividi tramite


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