本の虫

著者:江添亮
ブログ: http://cpplover.blogspot.jp/
メール: boostcpp@gmail.com
Twitter: https://twitter.com/EzoeRyou
GitHub: https://github.com/EzoeRyou

アマゾンの江添のほしい物リストを著者に送るとブログ記事のネタになる

筆者にブログのネタになる品物を直接送りたい場合、住所をメールで質問してください。

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