0

Die Postfix-Operatoren nehmen einen int Parameter. Es gibt bereits eine question as to why, und es scheint, als wäre die Antwort: "Because Bjarne Stroustrup said so"Sollten die Postfix-Operatoren nicht als binäre Operatoren betrachtet werden

Ich bin unwohl mit dieser Antwort. Wenn Bjarne Stroustrup etwas brauchte, um den Compiler anders zu kippen, wieso konnte er dann nicht einfach abtasten, ob der Operator eine Referenz zurückgegeben hat? Es lässt mich in Frage:

  1. Warum kann ich nicht tun: foo++ 13;
  2. Warum ist nicht der int Parameter auf 1 vorbelegt
  3. Warum dies überhaupt ein unärer Operator betrachtet wird, dauert es ein Argument

Antwort

6

Wenn Bjarne Stroustrup brauchte etwas, den Compiler zu kippen anders verhalten aus, warum nicht konnte er aus-Taste nur, ob der Bediener eine Referenz zurückgegeben?

Da Sie eine Funktion nicht überladen können, basierend auf ihrem Rückgabetyp. Es sind die Parameter, die const Qualifikation und Referenz Qualifikation, die die Funktion kann für

überlastet werden Warum kann ich nicht tun: foo++ 13;

Da der (int) Parameter für die Überladungsauflösung einfach da ist. Sie nehmen es nicht auf oder verwenden den Parameter nicht.

Warum ist nicht der int Parameter auf 1 vorbelegt

Wieder ist es nicht verwendet wird. Es ist nur da, um dem Compiler mitzuteilen, ob es sich um die Präfix- oder Postfix-Version handelt.

Warum wird dies ein unärer Operator überhaupt, ist es ein Argument

Es ein Argument nicht wirklich nehmen nimmt. Der Parameter dient nur dazu, sie anders zu machen. Es wirkt sich nur auf einen Operanden aus und arbeitet damit, so dass es ein unärer Operator ist.

+1

Kurze Version: Es ist ein Hack. –

+0

Sie spielen beide Seiten der Medaille: 1) "Weil Sie eine Funktion nicht überladen können, basierend auf ihrem 'Rückgabetyp" Sie sagen, dass die Methode den traditionellen Regeln folgen muss 2) "Weil der (' int') Parameter ist genau dort für die Überladungsauflösung. Sie nehmen es nicht auf oder verwenden den Parameter. " Sie sagen, dass die Methode nicht den traditionellen Regeln folgen muss. Ich sage, wenn es zumindest die Regeln brechen sollte, sollte es zumindest Sinn ergeben. –

+0

@ JonathanMee Es gibt keinen Weg in der Sprache, dem Compiler zu sagen, ob 'operator ++' der Präfix- oder Postfixoperator sein soll. Sie beschließen, es zu hacken, indem sie Überladungsauflösung verwenden.Anstatt eine spezielle Regel für die Behandlung des Rückgabewerts zu definieren, entscheiden sie, dass der Parameter der Marker für den Compiler wäre. Es ist ungefähr so ​​natürlich, wie Sie mit C++ arbeiten können. Tatsächlich verwenden wir verworfene Parameter an anderen Stellen, um Überladungen für den Compiler zu disambiguieren. – NathanOliver

2

Um die Frage im Titel zu beantworten: in foo++, ++ ist eindeutig ein unärer Operator. Die Tatsache, dass ihre Implementierung wie ein Binäroperator aussehen könnte, wenn man genau hinschaut, ändert sich nicht , wie es verwendet wird, und das macht es unär.

+0

Also [Ich fragte NathanOliver] (http://stackoverflow.com/questions/37049991/shouldnt-the-postfix-operators-be-considered-binary-operators#comment61647719_37050082) auch das, aber wenn die Art, wie es verwendet wird, nicht folge den Regeln, warum muss der Weg, den es entdeckt hat, sein? Warum konnten wir den Rückgabetyp für einen Operator, der so eine Anomalie ist, nicht ausschalten? –

+0

Es ist überhaupt keine Anomalie. 'int i = 0; i ++; '' my_type foo; foo ++; '. In beiden Fällen ist '++' ein unärer Operator. Das ist konsistent und nützlich; "Die Art wie es benutzt wird" ist in beiden Fällen gleich. –

+0

Die Anomalie ist, dass 'my_type & operator + = (int); 'ist ein binärer Operator und' my_type operator ++ (int); 'ist ein unärer Operator. –

Verwandte Themen