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