C++の規格におけるcontextually converted to boolという用語について
C++の規格には、"contextually converted to bool"という用語が出てくる。これは一体どういう意味なのか。
まず、"implicitly converted to a type T"という用語がある。これは、ある型Eの式eがあるとき、eをある型Tのオブジェクトtに暗黙に変換できるかどうかという意味で、
T t = e ;
が合法かどうかで決まる。
たとえば、型Eがクラスで、型Tに対する非explicit変換関数を持つ場合、EはTに暗黙に変換できる。
ところが、conditionと呼ばれる一部の文脈(ifやwhileやfor、!や&&や||、条件演算子、static_assert, noexcept)では、explicit変換関数であっても、見かけ上暗黙に変換できる。
struct X
{
explicit operator bool() { return true ; }
} ;
int main()
{
X x ;
if ( x ) { } // OK、boolに変換できる
}
これは、conditionが、contextually converted to boolという用語を使っているからだ。これを"contextually converted to bool"といい、以下の式が合法かどうかで判断される。
bool t(e) ;
そのため、boolへのexplicit変換関数を持つクラス型でもboolに変換できる。
もうひとつ、規格には"contextually implicitly converted to"(...a specified type T)という用語がある、 これは、今のところは整数定数式とswitch文だけで使われている用語で、そこでは整数型やunscoped enum型に暗黙に唯一の変換ができることが条件となっている。こちらは、explicit変換関数ではだめだ。
struct X { operator int() { return 0 ; } operator long () { return 0l ;} } ; int main() { X x ; // エラー、複数の整数型への変換関数がある switch( x ) { } }
ドワンゴ広告
この記事はドワンゴ勤務中に書かれなかった。
ドワンゴは本物のC++プログラマーを募集しています。
CC BY-ND 4.0: Creative Commons — Attribution-NoDerivatives 4.0 International — CC BY-ND 4.0