yohhoyの日記

技術的メモをしていきたい日記

bool型へのexplicitユーザ定義変換

C++11からはユーザ定義変換に対してexplicit指定ができ、意図しない暗黙の型変換を抑止できるようになった。一方で「bool型へのexplicitユーザ定義変換」だけは、記述されている場所に応じて(コンテキストに依存して)自動的にbool型へと変換される。

class T {
  //...
  explicit operator bool() const;  // 型T→boolへの変換
};

void func(bool);
T t;
func(t);        // NG: 暗黙的にT→boolへ変換されない
func(bool(t));  // OK: 明示的な型変換は許容

if (t) { ... }  // OK: "コンテキスト依存"のbool型への変換

C++11(N3337)言語仕様では、下記において“コンテキストに依存したbool型への変換(contextually converted to bool)”が行われると定義する。平易な表現では、セマンティクス上「真偽値が要求される場所」が列挙されている。

リスト末尾の2箇所では定数式(constant-expression)が要求されるため、bool型へのユーザ定義変換に対するconstexpr指定が必要。

本機能はC++03策定の翌年、2004年の(PDF)N1592 "Explicit Conversion Operators" が初出となる。(PDF)N2437(revision 3)で明確に "boolean-converted" という単語が導入され、N2462で "contextually converted to bool" に変更されて当時のドラフト文書N2461に登場している。

関連URL