re:だうと
ttp://blogs.wankuma.com/shuujin/archive/2007/07/16/85348.aspx
C++ ってなんでこんなに強力なんだろうね。テンプレートの存在と、あらゆる演算子を
オーバーロードできるせいかしら。いや、C++ を愛する人達の情熱のせいだ!オーバーロードすることができない演算子は複数あります >C++
404 Not Found
実用上オーバーロードが推奨されない演算子も複数ありますね。
MoreEffectiveC++の指摘を借りれば、
operator &&
operator ||
operator ,
if (expression1 && expression2) ...
が
if (expression1.operator&&(expression2)) ... // &&がメンバ関数
if (operator&&(expression1, expression2)) ... // &&が大域関数
と評価され、不断の&&や||とは振る舞いが変わる。
(詳しく言えば両項expressionの評価のされかたが変わる)
,演算子も普通の人にとってはオーバーロードされると意味が分からない。
ついでにオーバーロード「できない」演算子一覧。via MoreEffectiveC++
- .
- .*
- ::
- ?:
- new
- delete
- sizeof
- typeid
- static_cast
- dynamic_cast
- const_cast
- reinterpret_cast
(new 演算子は振る舞いをかえることができない。
placement new などが作用できるのはoperator newに対してである。
なぜならnew 演算子はoperator newを呼び出す、という振る舞いをするからだ。
これはnew 演算子の振る舞いを変えることではない。
new 演算子が呼び出す関数operator newの振る舞いを変えることになる。
……ややこしいな)
でオーバーロード可能な奴ら。
operator new
operator delete
operator new
operator delete
+ - * / % ^ & | ~
! = < > += -= *= /= %=
^= &= |= << >> >>= <<= == !=
<= >= && || ++ -- , ->* ->
() []
これを見ると「オーバーロードできること」=「強力」ではないと理解できる筈。
複雑さの源泉(の一端を担う要素)でもあり、Javaが演算子オーバーロードをいれなかった理由なのかも。