operator,()

C++ にはいろんな operator があるけど、その中に operator,() というのがあります。
それを使えば、こんなプログラムが書けます。

CString operator,(const CString& str1, const CString& str2)
{
    return str1 + str2;
}
CString str1(_T("あい"));
CString str2(_T("えお"));
str1 = (str1, str2); // str1 = ::operator,(str1, str2);と等価
                     // str1 == "あいえお" になる。

超変態コードです。こんなの書いた日にはお仕事一切頂けなくなります。


見た目が悪いって理由もありますが、それ以外にもれっきとした理由があって、例えば、

// operator,() は定義していない
CString str1(_T("あい"));
CString str2(_T("えお"));
str1 = (str1 += _T("う"), str1 += str2); // str1 == "あいうえお" になる

こんなプログラムを書いた場合、デフォルトのカンマ演算子の結合方向は左から右なので、結果は必ず "あいうえお" になります。


でも、operator,() がある場合は、

CString operator,(const CString& str1, const CString& str2)
{
    // カンマ演算子っぽく振る舞ってみる。
    return str2;
}
CString str1(_T("あい"));
CString str2(_T("えお"));
str1 = (str1 += _T("う"), str1 += str2);
// str1 = ::operator,(str1 += _T("う"), str1 += str2); と等価

こうなるので、関数の引数の中に評価式が入ることになります。
関数の引数にある式の評価順序は C++ では規定されていないので、str1 がどうなるのかは、コンパイラ依存になります。
ちなみに VS2005 でやると "あいえおう" になりました。str1 += str2 が先に計算されてます。
この計算順序を変える方法は存在しないそうです。
つまりカンマ演算子を自然に使うのは不可能ということになります。
operator,() を実装すると、こういった部分で混乱を招くだけなのでやってはいけません@More Effective C++ 項目7 より。