Udostępnij przez


Ostrzeżenie C26416

Współużytkowany parametr wskaźnika jest przekazywany przez odwołanie rvalue. Zamiast tego przekaż wartość.

Podstawowe wytyczne języka C++: R.34: Użycie parametru widżetu> shared_ptr<w celu wyrażenia współużytkowanej własności

Przekazywanie współużytkowanego wskaźnika przez odwołanie rvalue jest rzadko konieczne. Jeśli nie jest to implementacja semantyki przenoszenia dla samego typu wskaźnika współużytkowanego, współużytkowane obiekty wskaźnika mogą być bezpiecznie przekazywane przez wartość. Użycie odwołania rvalue może być również wskazaniem, że unikatowy wskaźnik jest bardziej odpowiedni, ponieważ wyraźnie przenosi unikatową własność od obiektu wywołującego do wywoływania.

Uwagi

  • To sprawdzenie rozpoznaje std::shared_pointer i typy zdefiniowane przez użytkownika, które mogą zachowywać się jak wskaźniki udostępnione. Następujące cechy są oczekiwane dla wskaźników udostępnionych zdefiniowanych przez użytkownika:

  • przeciążone dereference lub operatory dostępu do składowych (publiczne i nieużywane);

  • konstruktor kopiujący lub operator przypisania kopiowania (publiczny i nieuwzwiązany);

  • publiczny destruktor, który nie jest usuwany ani domyślnie. Puste destruktory są nadal liczone jako zdefiniowane przez użytkownika.

Przykłady

Wątpliwa optymalizacja konstruktora:

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)
{}

Wątpliwa optymalizacja konstruktora — uproszczona:

action::action(std::shared_ptr<transaction> t) noexcept
    : transaction_(std::move(t))
{}