とくにあぶなくないRiSKのブログ

危ないRiSKのブログだったかもしれない。本当はRiSKだけどググラビリティとか取得できるIDの都合でsscriskも使ったり。

constexpr が使えない

使えないのは前から気付いていたのですが,やはりコードを書くとその制限の多さにイライラとガッカリさせられますね。
例えば,constexpr な memcmp を実装することを考えてみましょう。
この関数は void const * 型の変数を受け取りますが,実際には内部で unsigned char const * 型へと変換し,バイト同士を unsigned char で比較します。unsigned char で比較する事は規格で決まっています。
では,memcmp を実装する前に,どこまで constexpr にできるのか実験して確認してみましょう。

int main()
{
 static constexpr signed char a{0}; // 元の型
 constexpr void const * p{&a}; // 元の型のポインタを取る・void const * への変換 OK
 constexpr unsigned char const * q{static_cast<unsigned char const *>(p)}; // unsigned char * への変換 OK
 constexpr unsigned char b{*q}; // unsinged char として使用 NG...
}

oops...
渡されたオブジェクトへバイト列としてアクセスできないってことは,memcmp 実装できないってこと。オワタ/(^o^)\
unsigned char と unsigned char[] を渡した場合はOKだけど,それって void const * で受け取る意味ないよねっていう…。
なんか,これと同じ理由で mem*系の関数まともに実装できないなぁ。えっ?そもそも,constexpr な memcmp なんて使わない?ごもっともだと思います。