簡體   English   中英

C ++邏輯&&和||的短路評估 運營商

[英]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

[3] https://en.wikipedia.org/wiki/Short-circuit_evaluation

您可以想象短路&&行為如下:

bool b = expr1 && expr2;

首先,它需要expr1expr2並將它們存儲在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.

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