[英]What it is going to be evaluated in a boolean expression?
假設我有以下變量
bool b;
int i;
T* ptr;
當我將b
, i
或ptr
或我擁有的任何其他變量放在類似布爾值的表達式中時
var1 && var2
要解決該表達式需要評估什么? C ++ 11標准說明了var1
和var2
哪些部分決定了布爾結果? 有隱式轉換嗎?
我不清楚標准對此有何說法。
編輯
我對如何將通用T
類型轉換為bool
以及如何根據標准解決布爾表達式感興趣
我不清楚您要問什么。 如果變量非零,則在C和C ++中為true。 &&運算符僅在左操作數為true時才評估右操作數。 除非存在轉換函數,否則不存在T類實例的真值。 這一切都在標准中。
§5.14/ 1
&&
運算符組從左到右。 操作數都在上下文中轉換為bool
類型(第4章)...與&
不同,&&
保證從左到右求值:如果第一個操作數為false
則不對第二個操作數求值。
§4/ 2
[ 注意:在幾種情況下,具有給定類型的表達式將隱式轉換為其他類型:
—用作運算符的操作數。 操作員對其操作數的要求決定了目標類型(第5條)。
...
這與標准一樣清晰。 首先將var1
隱式轉換為bool
,然后,如果為true
,則將var2
隱式轉換為bool
。
編輯:我也會引用§4.12/ 1
算術,無作用域枚舉,指針或指向成員類型的指針的prvalue可以轉換為
bool
類型的prvalue。 零值,空指針值或空成員指針值將轉換為false
; 其他任何值都將轉換為true
。 可以將std::nullptr_t
類型的prvalue轉換為bool
類型的prvalue; 結果值是false
。
編輯2:對於某些任意類型T
,請參見§4/ 3,
...某些語言構造要求將表達式轉換為布爾值。 在這樣的上下文中出現的表達式
e
被稱為在上下文中轉換為bool
,並且當且僅當聲明bool t(e);
,它的格式才正確bool t(e);
對於某些發明的臨時變量t
(8.5),其格式正確。
有關此初始化的含義,請參見第8.5 / 16節
—否則,如果源類型是(可能是cv限定的)類類型,則考慮轉換函數。 列舉了適用的轉換函數(13.3.1.5),並通過過載分辨率(13.3)選擇了最佳轉換函數。 如此選擇的用戶定義轉換將被調用,以將初始化器表達式轉換為正在初始化的對象。 如果轉換無法完成或模棱兩可,則初始化格式錯誤。
§13.3.1.5和§13.3甚至有更詳細的內容,但您將通宵閱讀一些內容。 但最重要的是,如果T
是類類型,則必須有一個轉換函數。 最佳實踐是為該類定義explicit operator bool
。 但是,您還可以執行類似於operator void*
,這是std::ios
及其派生類所定義的,因為然后可以按照標准轉換序列將void*
轉換為bool
。 (在C ++ 11中,這應視為不贊成使用的習慣用法。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.