- cpp23[meta cpp]
C++23では、以下の定数式文脈でのbool
への縮小変換を許可する:
static_assert
if constexpr
これにより、整数値からbool
への変換 (ビットフラグの判定などで使われる)、スコープをもたない列挙値型からbool
への変換ができる定数式の条件式内でできるようになる。
ただしexplicit(bool)
およびnoexcept(bool)
のパラメータについては縮小変換が許可されないため、整数値として値1
か0
のどちらかしか指定できず、noexcept(sizeof(char[2]))
のようなコードはコンパイルエラーとなる。
// 整数値が0でなければtrue、そうでなければfalse
static_assert(bool(N)); // これまでの書き方
static_assert(N); // C++23以降
static_assert(sizeof(int[2])); // C++23:OK 縮小変換
if constexpr(bool(flags & Flags::Exec)) { … } // これまでの書き方
if constexpr((flags & Flags::Exec) != 0) { … } // これまでの書き方
if constexpr(flags & Flags::Exec) { … } // C++23以降
if constexpr (sizeof(int[2])) { … } // C++23:OK 縮小変換