最終更新日時(UTC):
が更新

履歴 編集

function template
<bit>

std::bit_cast(C++20)

namespace std {
  template<typename To, typename From>
  constexpr To bit_cast(const From& from) noexcept;
}

概要

ビットレベルの再解釈キャストを行う。

低レイヤーのプログラムでは、同じビットを維持してほかの型に解釈し直したいことがある。その際、reinterpret_castや共用体を使用すると、Strict Aliasing規則に抵触して未定義動作になってしまう。安全な方法としてはstd::memcpy()を使用するなどがあるが、面倒なことなどから前述の危険な方法が多く見られた。そこで、同等の操作を簡単で安全にできるようにしたのが本関数である。

テンプレートパラメータ制約

戻り値

Toの値を返す。その戻り値の各ビットがfromと等しくなる。ただし、戻り値のパディングビットは未規定。

Tofromの値を表現できない場合の動作は未定義となる。そのような値が複数ある場合、生成される値は未規定。

例外

投げない

定数式に評価される条件

ToFrom、およびその全てのサブオブジェクトが以下の条件を全て満たすこと:

備考

  • この関数は、型Toにデフォルト構築可能であることの要求を行わない。以下に実装イメージを示す:
    template<typename To, typename From>
    To bit_cast(const From& from) noexcept { // 実際には、さらに要件チェックが行われる
      // この実装ではTo型がデフォルト構築可能である必要があるが、C++20のbit_castでは必要ない
      To result;
      std::memcpy(&result, &from, sizeof(To));  // memcpyはconstexprではないため、
                                                // コンパイラが特殊な実装をする必要がある
      return result;
    }
    

#include <iostream>
#include <cassert>
#include <bit>
#include <cstdint>
#include <cstring>

int main()
{
  float f = 3.14f;

  // ビット値を保って、単精度浮動小数点数 (IEEE 754準拠なら32ビット) を、32ビット整数に変換
  std::uint32_t n = std::bit_cast<std::uint32_t>(f);

  // 従来の方法
  std::uint32_t m = 0;
  std::memcpy(&m, &f, 4);

  std::cout << n << std::endl;
  std::cout << m << std::endl;
  assert(n == m);
}

出力

1078523331
1078523331

バージョン

言語

  • C++20

処理系

参照