[英]Short-circuit evaluation on C++ logical && and || operators
C ++中的用戶重載邏輯運算符( &&, ||
)表現得像常規函數。 也就是說, bool operator&&(const T &a, const T2 &b);
兩個參數bool operator&&(const T &a, const T2 &b);
在進入函數之前進行求值,因為輸入函數是C ++中的序列點[1]。 一切都好到這里。
現在,“內置運算符&&和|| 執行短路評估“[2] [3],其中左右兩側之間存在序列點。 引用的參考文獻不清楚“內置”是什么,只是他們采用bool
操作數,或者使用“上下文轉換為bool”來轉換它們。 它還提到只有“兩個標准庫類重載這些運算符[因為]短路屬性(...)不適用於重載,並且因為具有布爾語義的類型不常見。”[2]
具有布爾語義的類型? “內置運營商”究竟是如何運作的? 是否根本無法通過短路評估來定義邏輯運算符?
[1] https://en.wikipedia.org/wiki/Sequence_point
[2] http://en.cppreference.com/w/cpp/language/operator_logical
您可以想象短路&&
行為如下:
bool b = expr1 && expr2;
首先,它需要expr1
和expr2
並將它們存儲在lambda中:
bool b = and_helper( [&]{return expr1;}, [&]{return expr2;} );
並將它們轉發給助手,其中and_helper
(略有簡化):
template<class Lhs, class Rhs>
bool and_helper( Lhs&& lhs, Rhs&& rhs ) {
if (lhs()) return rhs();
return false;
}
這具有類似的短路行為。
對於用戶重寫的&&
以這種方式工作,我們必須自動lambda參數並將所述lambdas傳遞給用戶編寫的operator&&
。
因此,用戶定義的操作發生這種情況的唯一障礙是語法。 在對類型進行相對機械的轉換后,您可以獲得相同的行為,而無需借助魔法。
當它遇到該構造時,編譯器只進行了大致相同的操作(甚至在lambdas存在之前)。
這意味着短路不適用於用戶定義的運營商。
這是因為,正如你所說,它們的行為與功能相似。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.