[英]Magic of casting value to bool
今天我意識到為bool施加價值是一種魔力:
int value = 0x100;
unsigned char uc = static_cast<unsigned char>(value);
bool b = static_cast<bool>(value);
sizeof(uc)
和sizeof(b)
返回1
。 我知道uc
將包含0x00,因為只復制了LSB。 但是b
將是true
,所以我的假設是,當轉換為bool
,值被評估而不是復制。
這個假設是否正確? 這是標准的C ++行為嗎?
這沒有什么神奇之處。 從int
到unsigned char
的轉換定義為value % 256
(對於8位char
),這就是你得到的。 它可以實現為復制LSB,但你仍然應該在語義意義上考慮它,而不是實現。
同樣,將int
轉換為bool
定義為value != 0
,所以再次,這就是你得到的。
[conv.integral]
和[conv.bool]
的C ++ 11標准涵蓋了積分(和布爾)轉換。 對於C風格的演員表,請參閱[expr.cast]
和[expr.static.cast]
。
是的,當轉換為bool
,將評估值,而不是復制。
實際上,在您的示例中,只要value
不為0
, b
就為true
。
更新:從C ++ Primer第5版第2.1.2章引用:
When we assign one of the nonbool arithmetic types to a bool object, the result is false if the value is 0 and true otherwise.
它是標准的一部分:
4.12布爾轉換[conv.bool]
1算術,無范圍枚舉,指針或指向成員類型的指針的prvalue可以轉換為bool類型的prvalue。 零值,空指針值或空成員指針值轉換為false; 任何其他值都轉換為true。 類型為std :: nullptr_t的prvalue可以轉換為bool類型的prvalue; 結果值為false。
根據C風格的強制轉換規則 , (bool)value
實際上是static_cast
。 static_cast
的第一個規則然后開始,它計算臨時“聲明和初始化的值......如new_type Temp(expression);
”,即bool Temp(value);
。 這是明確定義的:如果value != 0
Temp
為true
value != 0
。 所以是的, value
在某種意義上是“評估”的。
轉換為bool
是一個繼承自普通舊C的特性。最初,C沒有bool
類型,在if
語句中使用其他類型很有用,如下所示:
int myBool = 1;
if(myBool) {
// C didn't have bools, so we had to use ints!
}
void* p = malloc(sizeof(int));
if(!p) {
// malloc failed to allocate memory!
}
當你轉換為bool
,它的行為就像你將語句放在if
。
當然,C ++向后兼容C,所以它采用了這個功能。 C ++還添加了將轉換重載為類的bool
功能。 iostream
執行此操作以指示流何時處於無效狀態:
if(!cout) {
// Something went horribly wrong with the standard output stream!
}
ISO / IEC C ++標准:
4.12布爾轉換[conv.bool] 1算術...類型的prvalue可以轉換為bool類型的prvalue。 零值...轉換為false; 任何其他值都轉換為true。
因此,由於prvalue是一個值,你可能會說該值得到了評估,盡管這是一種多樣性。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.