14

このコードの最後の行がコンパイルされないようにするにはどうすればよいですか?

#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
}

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

安全な bool イディオムはここに関連しているようですか?

4

3 に答える 3

19

の要点boost::optionalは、次のようなコードを有効にすることです。

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

したがって、への暗黙の変換boolは機能であり、コンパイルを妨げてはなりません。

于 2011-02-07T16:11:38.173 に答える
1

を使用している場合は、使用optionalする前に設定されているかどうかを判断できる必要があります。これを実装する方法は、(事実上 bool) 変換を使用することです。

ユーザーが実際にそこに書かれていることを望んでいなかったということは、私の考えではありませんoptional

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

もちろん、有効性をチェックする明示的な関数を使用して、必要なインターフェイスintの部分だけを提供する特定のニーズに合わせてラッパー クラスを実装することもできます。optional

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

于 2011-02-07T16:19:50.260 に答える