web-dev-qa-db-ja.com

生涯の要件を伝える方法は?

通常、私はstd :: unique_ptrを使用して所有権を伝え、所有権が暗示されていない場合はパラメーターとして生のポインターを渡します。ただし、nullptrを引数として受け入れることはほとんどないので、これを回避するために参照を使用するのは良いことですが、ほとんどの人が、パラメーターが参照するオブジェクトがの存続期間中に存在する必要があると期待するかどうかはわかりません。ソースコードを見ずに構造体A。

struct A {
    A(B& b)
    :  bPtr(&b) {;}

    void method() {
        // use bPtr
    }

    B* bPtr;
};

質問は次のとおりです。

1)ここでポインターを使い続け、常にnullptrをチェックする唯一のオプションはありますか?

3)Aが有効であるためにbPtrを必要とするという事実は、それがshared_ptrを取るべきであることを意味しますか?もしそうなら、私は事実上どこでも共有ポインタを使用するような気がします。

2)コメントやドキュメント以外に、パラメーターの有効期間の要件をユーザーに伝えるのに役立つ規則はありますか?

1
user487100

C++言語の観点からは、コードは問題ありません。

C++ユーザーとして、Bへの参照/ポインターを維持するか、コピーを作成するか、コンストラクターパラメーターをでのみ使用するかは、struct Aのセマンティクスに大きく依存します。コンストラクター。

私の一般的な期待は(特に明記しない限りすべて):

  • パラメータが(スマート)ポインタによって渡された場合、クラスはそのパラメータへの参照を保持する可能性があります
  • パラメータが(スマート)ポインタによって渡され、そのセッターがない場合、クラスはnullポインターを適切に処理しない可能性があります。これはコメントで補強できます。
  • パラメータがconst参照によって渡される場合、一時オブジェクトを渡しても安全です。受信オブジェクトは、コピーを作成するか、コンストラクター以外のパラメーターを使用しません。