web-dev-qa-db-ja.com

boost :: optional :: is_initialized()が推奨されないのはなぜですか?

今日、boost::optional::is_initialized()Boost 1.64.0リファレンス で非推奨とマークされていることに気付きました。私のプロジェクトには、is_initialized()がふんだんに散りばめられており、boost::optionalに値が含まれているかどうかを確認しています。

boost::optionalが初期化されているかどうかを適切にテストする他の方法がありません。何か不足していますか?

boost::optionalにはexplicit operator bool()があり、fooboost::optionalであれば、if(foo){...}を実行できます。ただし、fooboost::optional<bool>または他のboost::optional<T>であり、Tboolに変換可能な場合、これは誤った結果をもたらします。

Boostはユーザーに何を期待していますか?

16
Bernard

ただし、fooがboost :: optionalまたはTがboolに変換可能な他のboost :: optionalの場合、これは誤った結果をもたらします。

いいえ、基礎となる型への暗黙的な変換がないためです。オプションのalwaysの「真実性」¹は、初期化された状態を指します。

暗黙的な変換が行われるimpressionを取得した唯一の場合は、関係演算子です。ただし、これは基礎となる型への暗黙的な変換を行うのではなく、代わりに演算子のliftingを明示的に行います。

¹文脈に応じた(明示的な)ブール変換を意味します

更新

確かにboost::optional<bool>には警告があります c ++ 11より前のモード

2番目に、optional <>はC++ 11でboolへのコンテキスト変換を提供しますが、これは古いコンパイラーでの暗黙的な変換にフォールバックします

その場合は、明示的にboost::noneと比較することをお勧めします。

10
sehe

将来の参照のために、述べられているように ブーストのドキュメントで 、これからは次のように比較できます:

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){}

0
Keivan