115 lines
3.3 KiB
Markdown
115 lines
3.3 KiB
Markdown
[bit.cast]
|
||
|
||
# 22 General utilities library [[utilities]](./#utilities)
|
||
|
||
## 22.11 Bit manipulation [[bit]](bit#cast)
|
||
|
||
### 22.11.3 Function template bit_cast [bit.cast]
|
||
|
||
[ð](#lib:bit_cast)
|
||
|
||
`template<class To, class From>
|
||
constexpr To bit_cast(const From& from) noexcept;
|
||
`
|
||
|
||
[1](#1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L15691)
|
||
|
||
*Constraints*:
|
||
|
||
- [(1.1)](#1.1)
|
||
|
||
sizeof(To) == sizeof(From) is true;
|
||
|
||
- [(1.2)](#1.2)
|
||
|
||
is_trivially_copyable_v<To> is true; and
|
||
|
||
- [(1.3)](#1.3)
|
||
|
||
is_trivially_copyable_v<From> is true[.](#1.sentence-1)
|
||
|
||
[2](#2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L15699)
|
||
|
||
*Mandates*: Neither To nor From are consteval-only types ([[expr.const]](expr.const "7.7 Constant expressions"))[.](#2.sentence-1)
|
||
|
||
[3](#3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L15703)
|
||
|
||
*Constant When*: To, From, and the types of all subobjects
|
||
of To and From are types T such that:
|
||
|
||
- [(3.1)](#3.1)
|
||
|
||
is_union_v<T> is false;
|
||
|
||
- [(3.2)](#3.2)
|
||
|
||
is_pointer_v<T> is false;
|
||
|
||
- [(3.3)](#3.3)
|
||
|
||
is_member_pointer_v<T> is false;
|
||
|
||
- [(3.4)](#3.4)
|
||
|
||
is_volatile_v<T> is false; and
|
||
|
||
- [(3.5)](#3.5)
|
||
|
||
T has no non-static data members of reference type[.](#3.sentence-1)
|
||
|
||
[4](#4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/utilities.tex#L15715)
|
||
|
||
*Returns*: An object of type To[.](#4.sentence-1)
|
||
|
||
Implicitly creates objects nested within the result ([[intro.object]](intro.object "6.8.2 Object model"))[.](#4.sentence-2)
|
||
|
||
Each bit of the value representation of the result
|
||
is equal to the corresponding bit in the object representation
|
||
of from[.](#4.sentence-3)
|
||
|
||
Padding bits of the result are unspecified[.](#4.sentence-4)
|
||
|
||
For the result and each object created within it,
|
||
if there is no value of the object's type corresponding to the
|
||
value representation produced, the behavior is undefined[.](#4.sentence-5)
|
||
|
||
If there are multiple such values, which value is produced is unspecified[.](#4.sentence-6)
|
||
|
||
A bit in the value representation of the result is indeterminate if
|
||
it does not correspond to a bit in the value representation of from or
|
||
corresponds to a bit
|
||
for which the smallest enclosing object is not within its lifetime or
|
||
has an indeterminate value ([[basic.indet]](basic.indet "6.8.5 Indeterminate and erroneous values"))[.](#4.sentence-7)
|
||
|
||
A bit in the value representation of the result is erroneous
|
||
if it corresponds to a bit
|
||
for which the smallest enclosing object has an erroneous value[.](#4.sentence-8)
|
||
|
||
For each bit b in the value representation of the result
|
||
that is indeterminate or erroneous,
|
||
let u be the smallest object containing that bit enclosing b:
|
||
|
||
- [(4.1)](#4.1)
|
||
|
||
If u is of unsigned ordinary character type or std::byte type,u has an indeterminate value
|
||
if any of the bits in its value representation are indeterminate, or
|
||
otherwise has an erroneous value[.](#4.1.sentence-1)
|
||
|
||
- [(4.2)](#4.2)
|
||
|
||
Otherwise, if b is indeterminate, the behavior is undefined[.](#4.2.sentence-1)
|
||
|
||
- [(4.3)](#4.3)
|
||
|
||
Otherwise, the behavior is erroneous, and the result is as specified above[.](#4.3.sentence-1)
|
||
|
||
The result does not otherwise contain any indeterminate or erroneous values[.](#4.sentence-10)
|