Upozornění C26416
Parametr sdíleného ukazatele se předává odkazem na hodnotu rvalue. Místo toho předejte hodnotu.
C++ Core Guidelines: R.34: Převzetí shared_ptr parametr widgetu<> k vyjádření toho, že funkce je vlastníkem části
Předání sdíleného ukazatele podle odkazu rvalue je zřídka nutné. Pokud se nejedná o implementaci sémantiky přesunutí pro samotný typ sdíleného ukazatele, mohou být objekty sdíleného ukazatele bezpečně předány podle hodnoty. Použití odkazu rvalue může být také indikací, že jedinečný ukazatel je vhodnější, protože jasně přenese jedinečné vlastnictví z volajícího na volaný.
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
Optimalizace dotazovatelného konstruktoru:
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)
{}
Optimalizace dotazovatelného konstruktoru – zjednodušená:
action::action(std::shared_ptr<transaction> t) noexcept
: transaction_(std::move(t))
{}