のは、我々はいくつかのタイプT
用タイプstd::optional<T>
の変数std :: optional w/oの中にインスタンスを置くことは可能ですか?
std::optional<T> x;
があるとしましょう。 x
の内部にT
のコンストラクタを呼び出して初期化する場合は、メンバ関数std::optional::emplace
を呼び出すことができます。私が知っているように、このメンバ関数は、インスタンスがすでに存在するかどうかをチェックします(つまり、がtrue
と評価されます)。そうである場合、先に構築されたインスタンスを破棄し、提供されたコンストラクタおよび引数を使用して、
このチェックと破棄を行わずに初期化しかできないのだろうかと思います。 std::optional
を扱うときは、インスタンスが存在するかどうか最初に確認し、その結果に応じて別の作業を行うのが一般的です。したがって、std::optional
のインスタンスを入れ替える必要があるときは、初期化されたインスタンスが含まれていないことが既に分かっています。したがって、std::optional::emplace
の「安全でないバージョン」を提供することは妥当と思われますが、std::optional
にはそのようなメンバー機能はありません。これを達成する方法はありますか?おそらく、
は、(私はないと思います)std::optional
ためのメモリレイアウトに関するいくつかの保証がある場合は、その後、私は直接配置new
オペレーターを呼び出すことができます...
私はまともな最適化コンパイラがこれらの無駄なチェックを削除できることを願っています。このチェックが最適化された後もチェックされていますか? – JVApen
@JVApen特に、コンパイルがインライン化に失敗した別の関数の内部で構築が行われているときは、そうはしませんが、常にそうとは限りません。 –
すでに空であるアサーションを追加しようとしましたか?もちろん、@JVApen – JVApen