# std::as_bytes, std::as_writable_bytes

< cpp‎ | container‎ | span

template< class T, std::size_t N> std::span<const std::byte, S/* see below */> as_bytes(std::span<T, N> s) noexcept; | (1) |
template< class T, std::size_t N> std::span<std::byte, S/* see below */> as_writable_bytes(std::span<T, N> s) noexcept; | (2) |

获得对 span `s` 的元素的对象表示的视图。

若 `N` 为 `std::dynamic_extent` ，则返回的 span `S` 的长度亦为 `std::dynamic_extent` ；否则它是 sizeof(T) * N 。

`as_writable_bytes` 仅若 std::is_const_v<T> 为 false 才参与重载决议。

### 返回值

1) 以 {reinterpret_cast<const std::byte*>(s.data()), s.size_bytes()} 构造的 span 。
2) 以 {reinterpret_cast<std::byte*>(s.data()), s.size_bytes()} 构造的 span 。

### 示例

    #include <cstddef>
    #include <iomanip>
    #include <iostream>
    #include <span>

    void print(float const x, std::span<const std::byte> const bytes)
    {
        std::cout << std::setprecision(6) << std::setw(8) << x << " = { "
                  << std::hex << std::uppercase << std::setfill('0');
        for (auto const b : bytes) {
            std::cout << std::setw(2) << std::to_integer<int>(b) << ' ';
        }
        std::cout << std::dec << "}\n";
    }

    int main()
    {
        /* mutable */ float data[1] { 3.141592f };

        auto const const_bytes = std::as_bytes(std::span{ data });

        print(data[0], const_bytes);

        auto const writable_bytes = std::as_writable_bytes(std::span{ data });

        // 更改作为最高有效位的符号位（ IEEE 754 浮点标准）
        writable_bytes[3] |= std::byte{ 0b1000'0000 };

        print(data[0], const_bytes);
    }

可能的输出：

     3.14159 = { D8 0F 49 40 }
    -3.14159 = { D8 0F 49 C0 }

### 参阅

byte (C++17) | 字节类型 (枚举)