2016-09-20 8 views
3

次のコードを検討してください。C++ 11ではstd :: functionが暗黙的にboolに変換されないのはなぜですか?

#include <functional> 

int main(void) 
{ 
    std::function<void()> f1; 
    if (f1) { /* ok */ 
     ... 
    } 

    bool b = f1; /* compile-error */ 
    bool B = !f1; /* ok */ 
    ... 
} 

std::function<>は、いくつかの状況ではなく、それらのすべてにBOOLする暗黙的に変換します。 bool -variableに割り当てることはできませんが、操作の結果またはif()-文で使用するとOKです。

なぜそうですか?ブール演算をしなければならないようですが、変換が機能します。

私が仕事をしたのは、b = f1ラインでしたが、good ol 'double bang:!!です。このような現代のC++コードではアンティークのようです。

EDIT:これは、同様にコンパイル:

+2

オペレータboolは明示的にマークされているためです。 http://en.cppreference.com/w/cpp/utility/functional/function/operator_bool –

+0

@wasthishelpful同じ答えですが、同じ質問ではありません。 IMHO –

+0

私たちの答えは良いです。 –

答えて

7

std::function::operator boolは、暗黙的な変換が許可されていない、explicit変換関数です。だからbool b = f1;は動作しません。 (あなたはbool b = static_cast<bool>(f1);ようstatic_castを使用する場合は明示的な変換がうまく動作します。)

if() -statementでそれを使用してOKです。

ifoperator!又はoperator||で使用される場合、contextual conversionsは有効になり、明示的な変換関数が考慮されます。以下の5つのコンテキストで

(C++ 11以降)

、タイプboolが期待されていると宣言bool t(e);が整形式である場合、暗黙的な変換シーケンスが構築されます。すなわち、explicit T::operator bool() const;のような明示的なユーザ定義変換関数が考慮される。そのような表現eは、であり、文脈上ブールに変換可能であると言われている。ifwhileforの発現を制御

  • 論理演算子!,&&および||
  • 条件演算子?:;
  • static_assert;
  • noexcept
+1

したがって、明示的に要求されていても暗黙的、明示的、および文脈的に暗黙の変換があります。知っておいてよかった。 –

+0

@PatrickB。 '!'のため、 'bool'変換は明示的に宣言されていても暗黙的に適用されます。 –

関連する問題