0

後置演算子はintパラメータをとります。すでにquestion as to whyがあり、答えが次のようになっているようです: "Because Bjarne Stroustrup said so"Postfix演算子を考慮しないでください。バイナリ演算子

私はその答えに不快です。 Bjarne Stroustrupがコンパイラの動作を異なるようにする必要がある場合、なぜオペレータがリファレンスを返したかどうかを確認することができませんでしたか?

  1. は、なぜ私が行うことはできません:それは疑問を私に残し、これがすべてで単項演算子を考えられているのはなぜintパラメータは1
  2. にデフォルト設定されていないのはなぜfoo++ 13;
  3. は、それは引数を取る

答えて

6

Bjarne Stroustrupがコンパイラの動作を異なるようにする必要がある場合、なぜオペレータがリファレンスを返したかをキーオフできないのはなぜですか?

戻り値の型に基づいて関数をオーバーロードできないためです。 (int)パラメータは、オーバーロードの解決のためだけに存在しfoo++ 13;

ので:それはなぜ私が行うことができないパラメータ、関数が

オーバーロードすることができconst修飾および参照資格です。あなたはそれを取ったり、パラメータを使用したりしません。 intパラメータは、それが使用されていない再び1

にデフォルト設定されていないのはなぜ

。コンパイラに接頭辞または接尾辞のバージョンであるかどうかを伝えるだけです。

これがすべてで単項演算子を考えられている理由、それはそれは実際に引数を取らない引数

をとります。パラメータは、それらを異なるものにするためだけにあります。それは1つのオペランドにのみ作用し、作用するので、単項演算子です。

+1

短いバージョン:それはハックです。 –

+0

あなたはコインの両面をプレイしています:1) "その戻り値の型に基づいて関数をオーバーロードすることができないので、メソッドは伝統的な規則に従わなければならないと言っています2)"( 'int')オーバーロードの解決のためにそこに置いておきます。方法は従来のルールに従う必要はないと言っています。とにかくそれが規則を破るようになったら、それは理にかなっているはずです。 –

+0

@ JonathanMee 'operator ++'が接頭辞演算子または接尾辞演算子でなければならないということは、コンパイラに伝える方法がありません。彼らは、過負荷解決を使用してそれをハックすることに決めました。戻り値の処理のための特別なルールを作るのではなく、パラメータがコンパイラのマーカーになると判断します。 C++の仕組みと同じくらい自然なことです。実際には、他の場所でも破棄されたパラメータを使用して、コンパイラのオーバーロードを明確にします。 – NathanOliver

2

タイトルの質問に答えてください:foo++++は明らかに単項演算子です。その実装がバイナリ演算子のように見えるという事実は、それをちょうどよく見てもの使用方法はと変わらないので、単項式になります。

+0

[NathanOliverにお願いしました](http://stackoverflow.com/questions/37049991/shouldnt-the-postfix-operators-be-considered-binary-operators#comment61647719_37050082)これも使用していますが、ルールに従ってください、なぜそれが検出される方法はありますか?とにかくそのような異常な演算子の戻り値の型を取り止められないのはなぜですか? –

+0

それはまったく異常ではありません。 'int i = 0; i ++; '' my_type foo; foo ++; '。どちらの場合も、 '++'は単項演算子です。それは一貫して有用です。 「使用方法」はどちらの場合も同じです。 –

+0

異常は 'my_type&operator + =(int);'はバイナリ演算子であり、 'my_type演算子++(int);は単項演算子です。 –