2015-09-13

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

No comments: