[英]Using reinterpret_cast with bool
即使類型實際上持有1個字節的值,C ++也會自動將bool
值設置為true
或false
。
所以bool(123) == true
是true,
int i = 123;
bool b = i;
int j = b;
j
取值1
。
但是,當reinterpret_cast
與bool*
指針一起使用時,是否仍然如此? 例如
static_assert(sizeof(bool) == 1, "assuming sizeof(bool) is one in this example...");
std::uint8_t i = 123;
bool* b = reinterpret_cast<bool*>(&i);
int j = *b; // j becomes 1
if(*b == true) ... // condition is true
這些結果是否保證為真,還是不確定的行為? (即可以根據bool
對象已在內部表示為1
和0
的假設進行編譯)。
來自[basic.lval]:
如果程序嘗試通過以下類型之一以外的glvalue訪問對象的存儲值,則行為未定義:
(10.1)—對象的動態類型,
(10.2)—對象的動態類型的cv限定版本,
(10.3)—與對象的動態類型類似的類型(定義見4.4),
(10.4)—一種類型,是與對象的動態類型相對應的有符號或無符號類型,
(10.5)—一種類型,是與對象的動態類型的CV限定版本相對應的有符號或無符號類型,
(10.6)—聚合或聯合類型,在其元素或非靜態數據成員(包括遞歸地包括子聚合或所包含的聯合的元素或非靜態數據成員)中包括上述類型之一,
(10.7)—一種類型,它是對象的動態類型的(可能是cv限定的)基類類型,
(10.8)-char
或unsigned char
類型。
您正在嘗試通過bool
類型的glvalue訪問uint8_t
的存儲值。 這不適合這8個類別,因此行為是不確定的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.