にゃははー

はへらー

narrowing conversionを考慮したis_convertible

ってかnarrowing conversionを知らんって人のほうが多いか。
これはC++0xからの破壊的変更のひとつで、unified initializerを使った場合に暗黙の型変換を行わないっていうもの。
例えば、

int x[] = { 0.0 };

ってのはC++03では通ってて、double->intの暗黙的変換が行われていたんだけど、C++0xからはこれがill-formedになってます。
何でかってのとかはよく知らないので委員会に近い人に聞いてください。

ただし修飾子の違いはおkです。あとintegral promotionは考慮されてしまいます。(unsigned関係もintegral promotionかは忘れました

//int x1[] = { 0.0 }; // narrowing conversion
const double d = 0.0;
//int x2[] = { d }; // narrowing conversion
const int i = 0;
int x3[] = { i }; // ok
const int &ri = i;
int x4[] = { ri }; // ok
const char c = 0;
int x5[] = { c }; // ok: integral promotion
const unsigned int ui = 0u;
int x6[] = { ui }; // ok: integral promotion?

今ある[std|boost]::is_convertibleはこれが考慮されないやつなんだけど、なんでかよくわからないけど欲しくなったので書いた。
もしかしたらすでに存在するのかもしれないけど知らない。最発明だったらコメント欄で「プギャーーーーーwwwww」って言ってください。(言うだけじゃなくてどこにあるかも書いてください

https://github.com/Flast/trance/blob/master/trance/type_traits/is_convertible_without_narrowing.hpp