21

C ++には4つの演算子があり、オーバーロードできますが、自立型(非メンバー、スタンドアロン)関数としてオーバーロードすることはできません。これらの演算子は次のとおりです。

  • operator =
  • operator ()
  • operator ->
  • operator []

このスレッドは、非メンバー関数であることを禁止することの背後にある理論的根拠を完全によく説明していoperator =ます。他の3つについて何かアイデアはありますか?

4

2 に答える 2

20

元の投稿で言及されている4つの演算子=、、、()および->[]、実際には非静的メンバー関数として実装する必要があります(それぞれC++98§13.5.3/1、§13.5.4/ 1、§13.5.5/ 1および§13.5.6/1)。

Bjarne Stroustrupの理論的根拠は、この主題に関する以前の議論から思い出したように、言語にある程度の正気を保つことでした。クラス。

制限が本当にそれを助けることに完全に同意するかどうかはわかりませんが。

編集:私はこれについてBjarne Stroustrupに相談しました(彼はいつも助けになります)が、規則の明らかな矛盾は凍結された歴史的事故の場合にすぎないようです。彼は次のように述べています。「オーバーロードルールが策定されてから、左辺値と参照のルールが変更されたため、今は以前よりも悪くなっています。数年前にこの問題をもう一度調べようとしましたが、作成する前に時間がなくなりました。完全な提案。」

乾杯&hth。、

PS:「C ++の設計と進化」の本はこの種の質問には最適ですが、残念ながら私にはありません。

于 2010-10-14T22:40:02.787 に答える
2

comp.std.c ++のこのスレッドでは、質問について説明しています。

委員会に参加していたFrancisGlassborowは、次のように述べています。

言語設計者は、演算子=の左側のオペランドでの変換と昇格、または()と[]のオペランドでの変換と昇格をサポートしたくありませんでした。

次のような状況を回避しようとしています。

class A {};

class B { B(A& a) {} };

int operator()(B const& b) { return 0; }


int main(void)
{
    A a;

    // This works even though A doesn't have a () operator
    // It creates a temporary B and calls operator()(B& b)
    return a();                   
}
于 2010-10-14T23:27:16.163 に答える