簡體   English   中英

布爾表達式將要評估什么?

[英]What it is going to be evaluated in a boolean expression?

假設我有以下變量

bool b;
int i;
T* ptr;

當我將biptr或我擁有的任何其他變量放在類似布爾值的表達式中時

var1 && var2

要解決該表達式需要評估什么? C ++ 11標准說明了var1var2哪些部分決定了布爾結果? 有隱式轉換嗎?

我不清楚標准對此有何說法。


編輯

我對如何將通用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.

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