std::bit_cast
| ヘッダで定義 <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未満) |
|
各ビット
|
(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が発生するかどうかは未規定であった | 規定された |
関連項目
|
指定されたストレージ内にオブジェクト表現を再利用して暗黙的にオブジェクトを作成する
(関数テンプレート) |