私のクラスにはブールへの明示的な変換があります:
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 */;
キャストなしでt
をbool
としてどこで使用できますか?
規格では、値が "のコンテキストで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_ptr
のpointer
型)、コンテキストに応じて変換できます。また、NullablePointer
の等価演算子と不等価演算子の戻り値は、コンテキストでbool
に変換できる必要があります。
std::remove_if(first, last, [&](auto){ return t; });
Predicate
またはBinaryPredicate
と呼ばれるテンプレートパラメーターを使用するアルゴリズムでは、述語引数はT
を返すことができます。
std::sort(first, last, [&](auto){ return t; });
Compare
というテンプレートパラメータを持つアルゴリズムでは、コンパレータ引数はT
を返すことができます。Const変換演算子とnon-const変換演算子を混在させると混乱が生じる可能性があることに注意してください。