2011-02-07 16 views
13

このコードの最後の行がコンパイルされないようにする方法はありますか?ブールへのboost :: optionalの変換

#include <boost/optional.hpp> 

int main() 
{ 
    typedef boost::optional<int> int_opt; 
    int_opt opt = 0; 
    bool x = opt; // <- I do not want this to compile 
} 

最後の行はopt年代に格納されたint値を調べ、その代わりに、ブールへの型変換としてコンパイルし、ユーザーが意図したものではないようではありません。

安全なブールのイディオムがここに関係しているようですか? boost::optional

+4

何かのような意味ですか?あなたが望むものを英語で説明してください。コードでは、明らかにあなたが望むものが記述されていません。だから私たちはどのように知るべきですか? – Oswald

+1

できません、 'boost :: optional'は' operator! 'を実装しています。これが上記の最後の行をコンパイルする理由です。その演算子を隠すためにこれを派生させることはできません。コードを修正する必要があります。 – Nim

答えて

16

全体のポイントは、このようなコードを可能にすることである。

void func(boost::optional<int> optionalArg) 
{ 
    if (optionalArg) { 
     doSomething(*optionalArg); 
    } 
} 

だからboolへの暗黙的な変換が特徴であり、そしてコンパイルを防止すべきではありません。

+0

これは、ブールのイディオムが解決しようとするものではありませんか? (http://www.artima.com/cppsource/safebool.html) – dimba

+3

@dimba:自然に安全なboolイディオムは、純粋にブール値のコンテキストで値を使用することを妨げません。 – UncleBens

+0

@UncleBens - 確かに、最終行のx型をboolからintに変更すると、コンパイルエラーが発生します。 – dimba

1

optionalを使用している場合は、使用する前に設定されているかどうかを判断する必要があります。これが実装される方法は、(効果的にブール変換される)変換です。

実際にそこに書かれていることをユーザーが望んでいないことは、私の心の中ではありません。彼らはそれがoptionalであることを知っていて、彼らは正当性をチェックしています。

変換はboost::optionalの一部に組み込まれているため、直接削除する方法はわかりません。

int必要なラッパークラスを実装することもできます。optionalインターフェイスの一部だけを提供し、有効性をチェックする明示的な機能を備えている可能性があります。

optionalを使って作業しているときは、常にtemplate<class T> inline T const* get_pointer (optional<T> const& opt) ;またはその非constバージョンを使用して、何が起きているかを明示することができます。

1

以前のバージョンのBoostではこれまで説明してきたような問題がありました。これ以降は、boost::optionalのリリースではboolへの明示的な変換が行われ、表示されたコードはもうコンパイルされません。 See here

関連する問題