More Effective C++ 項目7 "&&"、"||"、あるいは"、"をオーバーロードしない
新訂版 More Effective C++ (AddisonーWesley professional co)
- 作者: スコット・メイヤーズ,安村通晃,伊賀聡一郎,飯田朱美,永田周一
- 出版社/メーカー: ピアソンエデュケーション
- 発売日: 2007/06/29
- メディア: 単行本(ソフトカバー)
- 購入: 8人 クリック: 129回
- この商品を含むブログ (43件) を見る
項目7 "&&"、"||"、あるいは"、"をオーバーロードしない
オーバーロードできても絶対しないけど。。
C/C++は、ブール式の短絡評価(short circuit evaluation)を採用している。
char *p; ... if ((p != 0) && (strlen(p) > 10)) { ...
pがnullの場合は、strlenを呼ばなくなる。
しかし、&&をオーバーロードすると短絡評価ではなくなってしまう。
if (expression1 && expression2) ...
この記述が次のように評価される。
// operator&&がメンバー関数の場合 if (expression1.operator&&(expression2) ... // operator&&がグローバル関数の場合 if (operator&&(expression1, expression2)) ...
どちらも引数が評価されるので、短絡評価にならない。
また、引数の評価順は不定なので、expression1とexpression2はどちらが先に評価されるかわからない。
","演算子は以下のものらしい。
for (int i = 0, j = strlen(s) - 1; i < j; ++i, --j) { // これが","演算子 ...
最初に演算子の左を評価し、次に右辺を評価する。式の結果は右辺の値になる。
この動作をオーバーロードして再現しようとしても、左辺と右辺をoperator,()の実引数でもらうことになるので、評価順を保証できない。
まとめ
演算子をオーバーロードするしかるべき理由がない限り、オーバーロードしない方が良く、&&や||にしかるべき理由なんてない。