與C一樣,C++使用布爾表達式短路求值法,這表示一旦确定了布爾表達式的真假值,即使還有部分表達式沒有被測試,布爾表達式也會停止運算。
C++允許更具使用者定義的類型,來定制&&或者||運算符,方法是重載operator&&或者operator||,在全局重載或者每個類中進行重載。然而,如果我們重載之後說什麼問題呢?這場“權利的遊戲”就被我們輕易修改了,這樣我們将使用函數調用法替代了短路求值法,這樣就喪失了短路求值的特性了!
例如我們重載了operator&&:
//對我們來說代碼是這樣的
if(expression1&&expression2) ...
//對編譯器來說等價于以下兩種代碼之一,至于哪一種就看我們自己重載的方式了
if(expression1.operator&&(expression2)) ...
if(operator&&(expression1,expression2) ...
因為我們重載了operator&&,是以其短路求值特性被阻塞,代之為函數調用法,帶來的弊端有兩種:
1)是以調用函數 funcition operator&&或者operator||時,兩個參數都需要計算,沒有采用短路替代;
2)C++原因規範沒有定義函數參數計算順序,是以我們無法指導表達式和表達式2那個先計算,完全有可能與從左到右計算順序的短路計算法相反。
同樣的原因适用于”,”運算符,是以我們需要避免重載這三種運算符。
同時C++中還存在一些限制,也不允許重載下面的操作符:
. .* :: ?: new delete sizeof typeid static_cast dynamic_cast const_cast reinterpret_cast