Share via


警告 C26418

共有ポインター パラメーターはコピーも移動もされません。 代わりに T* または T& を使用してください。

C++ Core Guidelines: R.36: const shared_ptr<widget>& パラメーターを使用して、オブジェクトへの参照カウントを保持する可能性があることを示します

共有ポインター パラメーターが値または定数オブジェクトへの参照によって渡される場合、関数は呼び出し元に影響を与えずにターゲット オブジェクトの有効期間を制御することが期待されます。 コードでは、共有ポインター パラメーターをコピーするか、別の共有ポインター オブジェクトに移動するか、共有ポインターを受け入れる関数を呼び出して他のコードに渡す必要があります。 それ以外の場合は、プレーンポインターまたは参照が可能な場合があります。

解説

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

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

  • コピー コンストラクターまたはコピー代入演算子 (public および non-deleted);

  • 削除されても既定化されてもいないパブリック デストラクター。 空のデストラクターは、従来通り、ユーザー定義としてカウントされます。

不必要に複雑なインターフェイス

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();
}

不必要に複雑なインターフェイス - 簡略化

template<class T>
std::string to_string(const T *e)
{
    return !e ? null_string : e->to_string();
}