Upozornění C26418
Parametr sdíleného ukazatele se nezkopíruje ani nepřesune. Místo toho použijte T* nebo T&.
C++ Core Guidelines: R.36: Vezměte const shared_ptr<widget>& parametr, který vyjadřuje, že by mohl zachovat počet odkazů na objekt
Pokud je parametr sdíleného ukazatele předán hodnotou nebo odkazem na konstantní objekt, očekává se, že funkce převezme kontrolu nad životností cílového objektu, aniž by to mělo vliv na volajícího. Kód by měl buď zkopírovat nebo přesunout parametr sdíleného ukazatele do jiného sdíleného objektu ukazatele, nebo ho předat jinému kódu vyvoláním funkcí, které přijímají sdílené ukazatele. Jinak může být možné použít prostý ukazatel nebo odkaz.
Poznámky
Tato kontrola rozpozná a
std::shared_pointer
uživatelem definované typy, které se pravděpodobně budou chovat jako sdílené ukazatele. U uživatelem definovaných sdílených ukazatelů se očekávají následující vlastnosti:přetížené dereference nebo operátory přístupu členů (veřejné a neodstranené);
konstruktoru kopírování nebo operátor přiřazení kopírování (veřejný a neodstraněný);
veřejný destruktor, který není odstraněný nebo výchozí. Prázdné destruktory se stále počítají jako uživatelem definované.
Příklady
zbytečná komplikace rozhraní
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();
}
zbytečná komplikace rozhraní – zjednodušená
template<class T>
std::string to_string(const T *e)
{
return !e ? null_string : e->to_string();
}