クラスFooがあります
class Foo;
ポインタを返すファクトリ:
std::unique_ptr<Foo> createFoo();
そして、私は Herb からFooの寿命について特別な主張のない単純な関数は単純な裸のポインタを取るべきだと言われたので:
void plainf(Foo* f);
私のクライアントはこれをどのように正しく行うべきですか?
plainF(createFoo());
彼が書く必要がある場合、彼は幸せではないだろう:
auto someName = createFoo();
plainF(someName.get());
get
メンバー関数を使用して、所有オブジェクトへの生のポインターを返すことができます。
_plainF(createFoo().get());
_
createFoo()
によって作成された一時は、plainF
が終了するまでスコープ外になりません。 plainF
がスコープ外にポインタを渡さない限り、これは完全に安全です。
plainF
への引数をNULL可能にする必要がない場合は、参照によって引数を取るように署名を変更して、少し冗長な構文を許可することもできます。
std::unique_ptr<Foo> createFoo();
void plainf(Foo& f);
plainF(*createFoo());
NathanOliver's answer に記載されているすべてのライフタイムに関する考慮事項が適用されるため、これは安全に使用できます。
これは、createFoo
が空のunique_ptr
。そのため、その機能が失敗することが許可されている場合、他の手段、たとえば、例外をスローします。