web-dev-qa-db-ja.com

キャストなしで明示的な演算子boolを使用できるのはいつですか?

私のクラスにはブールへの明示的な変換があります:

struct T {
    explicit operator bool() const { return true; }
};

そして、私はそれのインスタンスを持っています:

T t;

bool型の変数に割り当てるには、キャストを作成する必要があります。

bool b = static_cast<bool>(t);
bool b = bool(t);
bool b(t);  // converting initialiser
bool b{static_cast<bool>(t)};

explicit修飾子にもかかわらず、キャストなしで条件付きで自分のタイプを直接使用できることを知っています。

if (t)
    /* statement */;

キャストなしでtboolとしてどこで使用できますか?

31
Toby Speight

規格では、値が "のコンテキストでbool"に変換される可能性がある場所について言及しています。それらは4つの主要なグループに分類されます:

ステートメント

  • if (t) /* statement */;
    
  • for (;t;) /* statement */;
    
  • while (t) /* statement */;
    
  • do { /* block */ } while (t);
    

  • !t
    
  • t && t2
    
  • t || t2
    
  • t ? "true" : "false"
    

コンパイル時テスト

これらの演算子はconstexprである必要があります。

  • static_assert(t);
    
  • noexcept(t)
    
  • if constexpr (t)
    

アルゴリズムと概念

  • NullablePointer T
    

    標準がこの概念を満たす型を必要とする場合はどこでも(たとえば、std::unique_ptrpointer型)、コンテキストに応じて変換できます。また、NullablePointerの等価演算子と不等価演算子の戻り値は、コンテキストでboolに変換できる必要があります。

  • std::remove_if(first, last, [&](auto){ return t; });
    

    PredicateまたはBinaryPredicateと呼ばれるテンプレートパラメーターを使用するアルゴリズムでは、述語引数はTを返すことができます。

  • std::sort(first, last, [&](auto){ return t; });
    
    Compareというテンプレートパラメータを持つアルゴリズムでは、コンパレータ引数はTを返すことができます。

source1source2


Const変換演算子とnon-const変換演算子を混在させると混乱が生じる可能性があることに注意してください。

39
Toby Speight