Namespaces
Variants

std:: bit_cast

From cppreference.net
Utilities library
ヘッダーで定義 <bit>
template < class To, class From >
constexpr To bit_cast ( const From & from ) noexcept ;
(C++20以降)

From オブジェクト表現 を再解釈して型 To の値を取得する。返される To オブジェクトの 値表現 の各ビットは、 from オブジェクト表現 の対応するビットと等しい。返される To オブジェクトのパディングビットの値は未規定である。

To 型の値に対応する値表現が生成されない場合、動作は未定義です。複数のそのような値が存在する場合、どの値が生成されるかは未規定です。

結果の値表現におけるビットは、以下の場合に 不定 となります

  • From の値表現内のビットに対応していない場合(つまり、パディングビットに対応する場合)、または
  • 対応するビットが オブジェクトのビットであり、 (C++26まで) 最小包含オブジェクトが (C++26以降) その 生存期間 内にない場合、または
  • 不定値 を持つ場合。

結果の値表現におけるビットは、それが対応するビットの最小包含オブジェクトが erroneous value を持つ場合、そのビットは erroneous である。

(since C++26)


結果はそれ以外の不確定または不正な値を含まない。

結果の値表現における各不確定ビットについて、そのビットを含む最小のオブジェクトは不確定な値を持つ。そのオブジェクトが 初期化不要フレンドリー型 でない限り、動作は未定義である。

結果はそれ以外の不確定な値を含まない。

(C++26まで)

結果の値表現における各不確定または不正なビット b について、 b を含む最小のオブジェクトを u とする:

  • u 初期化不要フレンドリー型 の場合、 u はその値表現のビットが不確定であれば不確定な値を持ち、そうでなければ不正な値を持つ。
  • それ以外の場合、 b が不確定であれば、動作は未定義である。
  • それ以外の場合、動作は 不正 であり、結果は上記のように指定される。
(C++26から)

このオーバーロードは、以下の条件が満たされる場合にのみオーバーロード解決に参加します: sizeof ( To ) == sizeof ( From ) かつ、 To From の両方が TriviallyCopyable 型である場合です。

この関数テンプレートは、 constexpr であるのは、 To From および To From のすべてのサブオブジェクトの型のそれぞれが以下の条件を満たす場合に限ります:

  • 共用体型ではない;
  • ポインタ型ではない;
  • メンバへのポインタ型ではない;
  • volatile修飾型ではない;および
  • 参照型の非静的データメンバを持たない。

目次

翻訳の説明: - 「Contents」を「目次」に翻訳しました - HTMLタグ、属性、クラス名はすべて保持されています - リンクテキスト(Parameters、Return valueなど)はC++関連の専門用語として翻訳せずに保持しています - 番号付けと書式は完全に保持されています

パラメータ

from - 戻り値のビットソース

戻り値

To 型のオブジェクトであり、その値表現は前述の通りです。

実装例

std::bit_cast を実装するには、それが constexpr である事実を無視すると、必要に応じてオブジェクト表現を別の型として解釈するために std::memcpy を使用できます:

template<class To, class From>
std::enable_if_t<
    sizeof(To) == sizeof(From) &&
    std::is_trivially_copyable_v<From> &&
    std::is_trivially_copyable_v<To>,
    To>
// constexpr サポートにはコンパイラマジックが必要
bit_cast(const From& src) noexcept
{
    static_assert(std::is_trivially_constructible_v<To>,
        "この実装ではさらに、宛先型が自明に構築可能であることを要求します");
    To dst;
    std::memcpy(&dst, &src, sizeof(To));
    return dst;
}

注記

reinterpret_cast と同等の explicit cast ) は、ほとんどの場合、 type aliasing rule により、オブジェクト表現を再解釈するためにポインタ型または参照型の間で使用すべきではありません。

機能テスト マクロ 標準 機能
__cpp_lib_bit_cast 201806L (C++20) std::bit_cast

#include <bit>
#include <cstdint>
#include <iostream>
constexpr double f64v = 19880124.0; 
constexpr auto u64v = std::bit_cast<std::uint64_t>(f64v);
static_assert(std::bit_cast<double>(u64v) == f64v); // 往復変換
constexpr std::uint64_t u64v2 = 0x3fe9000000000000ull;
constexpr auto f64v2 = std::bit_cast<double>(u64v2);
static_assert(std::bit_cast<std::uint64_t>(f64v2) == u64v2); // 往復変換
int main()
{
    std::cout
        << "std::bit_cast<std::uint64_t>(" << std::fixed << f64v << ") == 0x"
        << std::hex << u64v << '\n'
        << "std::bit_cast<double>(0x" << std::hex << u64v2 << ") == "
        << std::fixed << f64v2 << '\n';
}

出力例:

std::bit_cast<std::uint64_t>(19880124.000000) == 0x4172f58bc0000000
std::bit_cast<double>(0x3fe9000000000000) == 0.781250

不具合報告

以下の動作変更欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
CWG 2482
( P1272R4 )
C++20 未確定ビットを伴う場合にUBが発生するかどうかは未規定であった 規定された

関連項目

指定されたストレージ内にオブジェクト表現を再利用して暗黙的にオブジェクトを作成する
(関数テンプレート)