C++17中std::byte的具體使用詳解
C++17中std::byte的定義如下:std::byte本質上代表一個字節(jié)的值
enum class byte : unsigned char {};
與unsigned char一樣,std::byte可以用來訪問其它對象(對象表示)占用的原始內存(raw memory),但與unsigned char不同的是,它不是字符類型,也不是算術類型。std::byte模型只是位的集合,僅支持按位和比較操作。
函數(shù)std::is_integral_v<T>定義如下:判斷T是不是整型,如T為整型,則返回true;如果T的類型為bool、char、char16_t、char32_t、wchar_t、short、int、long、long long,以及任何實現(xiàn)定義的擴展整數(shù)類型(any implementation-defined extended integer types),包括任何有符號、無符號、和cv限定的變體(cv-qualified variants),則返回true
template< class T > inline constexpr bool is_integral_v = is_integral<T>::value;
std::byte相關函數(shù):
(1).std::to_integer<T>(std::byte):將std::byte對象轉換為整型T,僅當is_integral_v<T>為true時有效;
(2).左移:<<=, 等價于: b = (std::byte)b << (T)shift; 僅當is_integral_v<T(shift)>為true時有效;
(3).左移:<<,等價于: std::byte(static_cast<unsigned int>(b) << (T)shift); 僅當is_integral_v<T(shift)>為true時有效;
(4).右移:>>=, 等價于: b = (std::byte)b >> (T)shift; 僅當is_integral_v<T(shift)>為true時有效;
(5).右移: >>, 等價于:std::byte(static_cast<unsigned int>(b) >> (T)shift); 僅當is_integral_v<T(shift)>為true時有效;
(6).按位&=、|=、^=:等價于:l = l & r; l = l | r; l = l ^ r;
(7).按位&、|、^、~:等價于:std::byte(static_cast<unsigned int>(l) | static_cast<unsigned int>(r));等
注意:
(1).列表初始化(使用花括號初始化)是唯一可以直接初始化std::byte對象的方法。
(2).std::byte對象存儲在棧上。
(3).sizeof(std::byte)的大小總是1.
(4).大多數(shù)時候std::byte位數(shù)是8,但在有些平臺上可能不是。
(5).用std::to_integer<>(std::byte)可以把std::byte轉換為任意基本整數(shù)類型(bool、字符類型或者整數(shù)類型)。
(6).std::byte沒有定義輸入和輸出運算符,因此不得不把它轉換為整數(shù)類型再進行I/O。
以下為測試代碼:
namespace {
std::ostream& operator<<(std::ostream& os, std::byte b)
{
return os << std::bitset<8>(std::to_integer<int>(b));
}
} // namespace
int test_byte()
{
// 注意:列表初始化(使用花括號初始化)是唯一可以直接初始化std::byte對象的方法
std::byte b{ 66 };
std::cout << b << "\n"; // 01000010
std::byte b2 = b << 1;
std::cout << b2 << "\n"; // 10000100
b <<= 1;
std::cout << b << "\n"; // 10000100
std::byte b3 = b >> 1;
std::cout << b3 << "\n"; // 01000010
b >>= 1;
std::cout << b << "\n"; // 01000010
std::byte b4 = b | std::byte{ 0b11110000 };
std::cout << b4 << "\n"; // 11110010
b |= std::byte{ 0b11110000 };
std::cout << b << "\n"; // 11110010
b4 = b & std::byte{ 0b11110000 };
std::cout << b4 << "\n"; // 11110000
b &= std::byte{ 0b11110000 };
std::cout << b << "\n"; // 11110000
b4 = b ^ std::byte{ 0b11111111 };
std::cout << b4 << "\n"; // 00001111
b ^= std::byte{ 0b11111111 };
std::cout << b << "\n"; // 00001111
b4 = ~b;
std::cout << b4 << "\n"; // 11110000
std::byte b5;
//std::cout << b5 << "\n"; // error: 如果沒有初始化,std::byte對象的值是未定義的,因為它存儲在棧上
std::byte b6{};
std::cout << b6 << "\n"; // 00000000
std::cout << "sizeof std::byte: " << sizeof(std::byte) << "\n"; // sizeof std::byte: 1
std::byte b7{ 0xFF };
std::cout << std::to_integer<unsigned int>(b7) << ","
<< std::to_integer<int>(b7) << ","
<< static_cast<int>(std::to_integer<signed char>(b7)) << "\n"; // 255,255,-1
return 0;
}
執(zhí)行結果如下圖所示:

GitHub:https://github.com/fengbingchun/Messy_Test
到此這篇關于C++17中std::byte的具體使用詳解的文章就介紹到這了,更多相關C++17 std::byte內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

