今日、boost::optional::is_initialized()
が Boost 1.64.0リファレンス で非推奨とマークされていることに気付きました。私のプロジェクトには、is_initialized()
がふんだんに散りばめられており、boost::optional
に値が含まれているかどうかを確認しています。
boost::optional
が初期化されているかどうかを適切にテストする他の方法がありません。何か不足していますか?
boost::optional
にはexplicit operator bool()
があり、foo
がboost::optional
であれば、if(foo){...}
を実行できます。ただし、foo
がboost::optional<bool>
または他のboost::optional<T>
であり、T
がbool
に変換可能な場合、これは誤った結果をもたらします。
Boostはユーザーに何を期待していますか?
ただし、fooがboost :: optionalまたはTがboolに変換可能な他のboost :: optionalの場合、これは誤った結果をもたらします。
いいえ、基礎となる型への暗黙的な変換がないためです。オプションのalwaysの「真実性」¹は、初期化された状態を指します。
暗黙的な変換が行われるimpressionを取得した唯一の場合は、関係演算子です。ただし、これは基礎となる型への暗黙的な変換を行うのではなく、代わりに演算子のliftingを明示的に行います。
¹文脈に応じた(明示的な)ブール変換を意味します
確かにboost::optional<bool>
には警告があります c ++ 11より前のモード :
2番目に、optional <>はC++ 11でboolへのコンテキスト変換を提供しますが、これは古いコンパイラーでの暗黙的な変換にフォールバックします
その場合は、明示的にboost::none
と比較することをお勧めします。
将来の参照のために、述べられているように ブーストのドキュメントで 、これからは次のように比較できます:
boost::optional<int> oN = boost::none;
boost::optional<int> o0 = 0;
boost::optional<int> o1 = 1;
assert(oN != o0);
assert(o1 != oN);
assert(o0 != o1);
assert(oN == oN);
assert(o0 == o0);
あなたも行うことができます:
if(oN != 2){}
または、単に値が設定されているかどうかを確認します。
if(oN){}