次の方法で共有


警告 C26416

共有ポインター パラメーターは、rvalue 参照によって渡されます。 代わりに値渡しにします。

C++ Core Guidelines: R.34: 関数が部分所有者であることを表すには shared_ptr<widget> パラメーターを受け取る

右辺値参照で共有ポインターを渡す必要はほとんどありません。 共有ポインター型自体の移動セマンティクスの実装でない限り、共有ポインター オブジェクトは値渡しで安全に渡すことができます。 rvalue 参照を使用すると、呼び出し元から呼び出し先に一意の所有権が明確に転送されるので、ユニーク ポインターの方が適切である可能性があります。

解説

  • このチェックでは、共有ポインターのように動作する可能性が高い std::shared_pointer 型とユーザー定義型が認識されます。 ユーザー定義の共有ポインターには、次の特徴が必要です。

  • オーバーロードされた逆参照またはメンバー アクセス演算子 (パブリックおよび非削除)

  • コピー コンストラクターまたはコピー代入演算子 (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))
{}