Skip to content

Latest commit

 

History

History
48 lines (31 loc) · 1.87 KB

narrowing_contextual_conversions_to_bool.md

File metadata and controls

48 lines (31 loc) · 1.87 KB

定数式の文脈でのboolへの縮小変換を許可 [P1401R5]

  • cpp23[meta cpp]

このページはC++23に採用された言語機能の変更を解説しています。

のちのC++規格でさらに変更される場合があるため関連項目を参照してください。

概要

C++23では、以下の定数式文脈でのboolへの縮小変換を許可する:

  • static_assert
  • if constexpr

これにより、整数値からboolへの変換 (ビットフラグの判定などで使われる)、スコープをもたない列挙値型からboolへの変換ができる定数式の条件式内でできるようになる。

ただしexplicit(bool)およびnoexcept(bool)のパラメータについては縮小変換が許可されないため、整数値として値10のどちらかしか指定できず、noexcept(sizeof(char[2]))のようなコードはコンパイルエラーとなる。

static_assertの例

// 整数値が0でなければtrue、そうでなければfalse
static_assert(bool(N)); // これまでの書き方
static_assert(N);       // C++23以降

static_assert(sizeof(int[2])); // C++23:OK 縮小変換

if constexprの例

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 縮小変換

参照