最終更新日時(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::aligned_storagestd::memcpy()を組み合わせて使用することになるが、それを簡単に使用できるようにしたのが本関数である。

要件

以下の条件のいずれかを満たさない場合、この関数はオーバーロード解決の候補から除外される:

ToFrom、およびその全てのサブオブジェクトが以下の条件を全て満たす場合、本関数はconstexpr関数として評価される:

戻り値

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

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

例外

投げない

#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

処理系

参照