簡體   English   中英

在bool中使用reinterpret_cast

[英]Using reinterpret_cast with bool

即使類型實際上持有1個字節的值,C ++也會自動將bool值設置為truefalse

所以bool(123) == true是true,

int i = 123;
bool b = i;
int j = b;

j取值1


但是,當reinterpret_castbool*指針一起使用時,是否仍然如此? 例如

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對象已在內部表示為10的假設進行編譯)。

來自[basic.lval]:

如果程序嘗試通過以下類型之一以外的glvalue訪問對象的存儲值,則行為未定義:
(10.1)—對象的動態類型,
(10.2)—對象的動態類型的cv限定版本,
(10.3)—與對象的動態類型類似的類型(定義見4.4),
(10.4)—一種類型,是與對象的動態類型相對應的有符號或無符號類型,
(10.5)—一種類型,是與對象的動態類型的CV限定版本相對應的有符號或無符號類型,
(10.6)—聚合或聯合類型,在其元素或非靜態數據成員(包括遞歸地包括子聚合或所包含的聯合的元素或非靜態數據成員)中包括上述類型之一,
(10.7)—一種類型,它是對象的動態類型的(可能是cv限定的)基類類型,
(10.8)- charunsigned char類型。

您正在嘗試通過bool類型的glvalue訪問uint8_t的存儲值。 這不適合這8個類別,因此行為是不確定的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM