경고 C26416

공유 포인터 매개 변수는 rvalue 참조를 통해 전달됩니다. 대신 값으로 전달합니다.

C++ 핵심 지침: R.34: shared_ptr<위젯> 매개 변수를 사용하여 함수가 부분 소유자임을 표현합니다.

rvalue 참조로 공유 포인터를 전달하는 것은 거의 필요하지 않습니다. 공유 포인터 형식 자체에 대한 이동 의미 체계를 구현하지 않는 한 공유 포인터 개체는 값으로 안전하게 전달될 수 있습니다. rvalue 참조를 사용하면 고유 포인터가 호출자에서 호출 수신자로 고유 소유권을 명확하게 전송하므로 더 적합하다는 표시일 수도 있습니다.

설명

  • 이 검사 공유 포인터처럼 동작할 가능성이 있는 사용자 정의 형식을 인식하고 std::shared_pointer 인식합니다. 사용자 정의 공유 포인터에는 다음과 같은 특성이 필요합니다.

  • 오버로드된 역참조 또는 멤버 액세스 연산자(public 및 non-deleted);

  • 복사 생성자 또는 복사 할당 연산자(public 및 non-deleted);

  • 삭제되거나 기본값이 아닌 공용 소멸자입니다. 빈 소멸자는 여전히 사용자 정의로 계산됩니다.

예제

의심스러운 생성자 최적화:

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

의심스러운 생성자 최적화 - 간소화:

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