Bedenken Sie:Wie erweitert ein C++ - Compiler den Präfix- und Postfixoperator ++()?
class Example
{
private:
int m_i;
public:
Example(int i) : m_i{i} {}
//Post-fix
Example operator++(int) {m_i++; return *this;}
//Pre-fix
Example& operator++() {m_i++; return *this;}
void print() const {std::cout << m_i << '\n'}
};
ich damit experimentiert, um zu bestimmen, wie der Compiler einen Aufruf an die Präfix und Postfix-Operatoren erweitert.
Zum Beispiel, wenn ich so etwas schreiben:
Example e = 1;
e++;
ich es erwartet, dass so etwas wie „e.operator ++ (int)“ zu erweitern, oder es einen Schritt weiter, erwartete ich
e++(2);
zu etwas wie "e.operator ++ (2)." Zu erweitern, aber was ich stattdessen bekomme, ist der Compiler beschweren sich über einige "no match for call to '(Example) (int)'".
Als nächstes war ich neugierig, wie "++ e" auf mysteriöse Weise in "e.operator ++()" expandiert, d. H. Diejenige, die eine Referenz zurückgibt.
um etwas mehr Spielen, landete ich mit:
Example e = 1;
++e++;
e.print();
Welche 2 gedruckt, und dann:
Example e = 1;
(++e)++;
e.print();
Welche 3.
gedruckt Ich verstehe, dass (++ e) gibt einen Verweis auf das Objekt zurück, das dann um eins nach oben inkrementiert wird, das macht also Sinn. Ich vermute auch, dass "++ e ++" hier dem Postfixoperator Vorrang einräumt (wie ich in einem anderen Post gelesen habe), so dass die temporäre Variable, die vom Postfixoperator zurückgegeben wird, inkrementiert wird. Auch das macht Sinn. Dies führte mich darüber, wie Ausdrücke zu fragen, wie
++++e
++e++++
++++e++
++++e++++
werden erweitert (alle kompilieren und ausführen mit den erwarteten Ergebnissen).
Also wirklich, was zum Teufel geht auf der Innenseite und wie weiß der Compiler, welcher Operator ++() aufgerufen wird, und wie werden diese Ausdrücke erweitert (besonders im Präfix Fall)? Was ist der Zweck der Platzhaltervariablen in "operator ++ (int)"?
Der Platzhalter dient nur dazu, die beiden Operatoren während der Überladungsauflösung unterscheiden zu können. Das Argument ist nicht spezifiziert und muss nicht verwendet werden. –
Lesen Sie den obigen Link, alle Ihre konstruierten Beispiele am Ende fehlt Sequenzpunkte. – CoryKramer
Damit sich Ihr Postfix-Operator semantisch wie erwartet verhält, ändern Sie ihn wie folgt: 'Beispieloperator ++ (int) {return Beispiel (m_i ++); } ' –