假設我有以下變量它將在布爾表達式中進行評估?
bool b;
int i;
T* ptr;
當我把b
,i
或ptr
,或任何其他變量我有,在一個布爾表達式像
var1 && var2
這是怎麼回事進行評估解決這個表達? C++ 11標準說明了什麼是var1
和var2
的部分,它們有助於確定布爾結果?有隱式投射?
目前還不清楚我是什麼標準說這件事。
編輯
我感興趣的是如何通用T
類型是根據標準
假設我有以下變量它將在布爾表達式中進行評估?
bool b;
int i;
T* ptr;
當我把b
,i
或ptr
,或任何其他變量我有,在一個布爾表達式像
var1 && var2
這是怎麼回事進行評估解決這個表達? C++ 11標準說明了什麼是var1
和var2
的部分,它們有助於確定布爾結果?有隱式投射?
目前還不清楚我是什麼標準說這件事。
編輯
我感興趣的是如何通用T
類型是根據標準
§5.14/ 1
的
&&
操作員組左到右。操作數被上下文轉換爲類型bool
(條款4)...不同於&
,&&
保證從左到右 評估:如果第一個操作數是false
,則不評估第二個操作數。
§4/ 2
[注:表達式與給定類型將被隱式轉換到其它類型的在若干上下文:
- 當用作運算符的操作數使用。操作員對操作數的要求決定了目標類型(第5章)。
...
這是幾乎一樣澄清的標準得到。首先var1
將被隱式轉換爲bool
,然後,如果是true
,var2
將被隱式轉換爲bool
。
編輯:我會引用也§4.12/ 1
算術,無作用域枚舉,指針,或指向構件類型的prvalue可以被轉換爲一個 prvalue
bool
類型。零值,空指針值或空成員指針值被轉換爲false
; 其他任何值都轉換爲true
。std::nullptr_t
類型的價值可以轉換爲 類型的價值bool
;結果的值是false
。
編輯2:對於某些任意類型T
,見§4/ 3,
...某些語言結構需要一個表達式是 轉換爲一個布爾值。出現在這樣的背景下的表達式
e
被說成是上下文 轉換爲bool
並且結構良好的當且僅當是公形成的聲明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中被看作是一個不贊成使用的習慣用語。)
這不是很清楚,我轉換成bool
和一個布爾表達式是如何解決你」再問一次。 C和C++中的變量如果不爲零,則爲true。如果左操作數爲真,則運算符僅評估右操作數。除非有轉換函數,否則T類實例的真值不存在。這都是標準。
你答案的最後部分是關於「短路評估」,這不是我的觀點。根據你的答案的第一部分,我應該假設僅僅「左值」有助於表達? – user2485710
我不知道你的觀點是什麼,我是這麼說的。你的問題中沒有l值。請澄清。 – EJP
我剛剛編輯了我的問題,讓我們看看現在是否更清晰。 – user2485710
你的任何引用都不會說「如何」,我的觀點恰恰是「如何」,應該發生什麼以及如何評估。 – user2485710
那麼,你的問題根本不使用「how」這個詞。目前還不清楚你在問什麼...... – Brian
@ user2485710它取決於類型以及它是否定義了任何自定義轉換函數。對於數字和指針類型,非零/非null爲true,而零/ null爲false。 –