Namespaces
Variants

std::bit_cast

ja.cppreference.net から
 
 
ユーティリティライブラリ
言語サポート
型サポート (基本型, RTTI)
ライブラリ機能テストマクロ (C++20)
プログラムユーティリティ
可変引数関数
コルーチンサポート (C++20)
契約サポート (C++26)
三方比較
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

汎用ユーティリティ
関係演算子 (C++20で非推奨)
整数比較関数
(C++20)(C++20)(C++20)    
(C++20)
交換 と 型操作
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
共通の語彙型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)



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

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

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

結果の値表現のビットは不定である場合

  • の値表現のビットに対応しないFrom (つまりパディングビットに対応する), または
  • ビットに対応するのオブジェクトで(C++26未満)最も内側のオブジェクトが(C++26以降)そのライフタイム内にないライフタイム, または
  • を持つ不定値。

結果の値表現のビットはエラーのビットに対応し、最も内側のオブジェクトがエラー値。

(C++26以降)


それ以外に結果に不定値やエラー値は含まれません。

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

それ以外に結果に不定値は含まれません。

(C++26未満)

各ビットbに対して、結果の値表現の中で不定またはエラーである場合、uを囲む最小のオブジェクトとするb:

  • もしuが未初期化フレンドリな型である場合、uの値表現のビットのいずれかが不定であれば不定値を持ち、そうでなければエラー値を持ちます。
  • そうでなく、もしbが不定であれば、動作は未定義です。
  • そうでなければ、動作はエラーで、結果は上記の通りです。
(C++26以降)

このオーバーロードは、次の場合にのみオーバーロード解決に参加します:sizeof(To) == sizeof(From) かつTo とFrom はTriviallyCopyable型です。

この関数テンプレートはconstexpr次のすべての条件を満たす場合にのみ To, From および のすべてのサブオブジェクトの型がTo とFrom:

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

パラメータ

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が発生するかどうかは未規定であった 規定された

関連項目

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