Skip to content

Latest commit

 

History

History
71 lines (51 loc) · 1.57 KB

071-cpp17-misc-byte.md

File metadata and controls

71 lines (51 loc) · 1.57 KB

std::byte

std::byteはヘッダーファイル<cstddef>で以下のように定義されている。

namespace std {

    enum class byte : unsigned char {};

    // byte型に対する演算子のオーバーロード
}

std::byte型は、生のバイト列を表すための型として使うことができる。生の1バイトを表すにはchar型が慣習的に使われてきたが、std::byte型は生の1バイトを表現する型として、新たにC++17で追加された。

std::byte型は強い型によって、暗黙の型変換を防ぐ。

int main()
{
    // OK、暗黙の型変換
    char c = 0 ;
    c += 1 ;

    // エラー、int型からstd::byte型に変換できない
    std::byte b = 0 ;
    // エラー、int型からstd::byte型に変換できない
    b += 1 ;
}

std::byteを扱うには、明示的なキャストが必要だ。

int main()
{
    std::byte b = static_cast<std::byte>(0) ;
    b += static_cast<std::byte>(1) ;
}

これによって、型の取り違えを防ぐことができる。

void f()
{
    // 数字の1
    int va1 = 20 ;

    // 長いコード


    
    std::byte b = static_cast<std::byte>(0b00000001) ;
    // アルファベットl
    std::byte val = static_cast<std::byte>(0b11110000) ;

    b |= va1 ; // エラー
}

std::byteは内部のストレージをバイト単位でアクセスできるようにするため、規格上charと同じ様な配慮が行われている。

int main()
{
    int x = 42 ;

    std::byte * rep = reinterpret_cast< std::byte * >(&x) ;
}