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:
Post a Comment
You can use some HTML elements, such as <b>, <i>, <a>, also, some characters need to be entity referenced such as <, > and & Your comment may need to be confirmed by blog author. Your comment will be published under GFDL 1.3 or later license with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.