typeC
のメンバーを持つクラスを書いています。このメンバーは、インスタンスのリフトタイム全体で定義され、有効である必要があります。ただし、コンパイル時にそれを構築するために必要な情報がありません。つまり、使用できません。foo
foo_t
C
class C {
foo_t foo { arg };
}
ctor ofC
が呼び出されたときにそれを構築することもできません。つまり、持つことはできません
class C {
foo_t foo;
C (whatever) : foo(compute_arg(whatever)) { }
}
C
むしろ、 ctor内のいくつかのコードが実行された後にしか構築できません。編集:これの理由は、構築引数を取得するために副作用(ディスクまたはネットワークI / Oなど)を伴うコードを実行する必要があるためかもしれません。また、他のメンバーを初期化できるようにするためにもそのコードを実行する必要があるため、初期化リストからフリー関数として何度も呼び出すことはできません。
では、どのように表現すればよいのfoo
でしょうか?
foo_t
ダミー/無効/空/null値でデフォルト構築できる場合は、それを発生させ、そのダミー状態では決してアクセスされないことを知って安全にすることができます。欠点: inの宣言は、それが常に有効であることを示していませんfoo
C
。有効な状態しかない場合
foo_t
、つまり、関連する情報が得られるまでまったく構築できない場合、次のようになります。- 私は使用できます
std::unique_ptr<foo_t>
。最初は でnullptr
、次に に割り当てられます。欠点: 終了後に null になることは決してないという兆候はありませんC()
。無駄な割り当て。 - 私は使用できます
std::optional<foo_t>
。最初は でnullopt
、次に に割り当てられます。不利な点: 終了後に空にならないという兆候はありませんC()
。C++14 が必要です。「オプション」という言葉は、「オプション」であることを示唆していますがfoo
、そうではありません。
- 私は使用できます
最初のケースでは、 afoo_t
の有効性に関するあいまいさが組み込まれているため、2 番目のケースにもっと興味があります。私が言及した2つに代わるより良い方法はありますか?
注: を変更することはできませんfoo_t
。