ikautak.log

C/C++, Python, CUDA, Android, Linux kernel, Network, etc.

More Effective C++ 項目7 "&&"、"||"、あるいは"、"をオーバーロードしない

新訂版 More Effective C++ (AddisonーWesley professional co)

新訂版 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,()の実引数でもらうことになるので、評価順を保証できない。

まとめ
演算子をオーバーロードするしかるべき理由がない限り、オーバーロードしない方が良く、&&や||にしかるべき理由なんてない。