webentwicklung-frage-antwort-db.com.de

Wie wird der Rückgabetyp eines ternären Operators bestimmt?

Ich habe ein Problem mit der Bewegung eines Bischofs auf einem Schachbrett gelöst. An einem Punkt meines Codes hatte ich die folgende Aussage:

std::cout << (abs(c2-c1) == abs(r2-r1)) ? 1 : 2 << std::endl;

Dies erzeugt den folgenden Fehler:

error: invalid operands of types 'int' and '<unresolved overloaded function type>' to binary 'operator<<'

Ich habe diesen Fehler jedoch sofort behoben, indem ich eine zusätzliche Variable in meinen Code aufgenommen habe:

int steps = (abs(c2-c1) == abs(r2-r1)) ? 1 : 2;
std::cout << steps << std::endl;

Wie funktioniert der ternäre Operator und wie wird sein Rückgabetyp bestimmt (wie der Compiler ihn nannte <unresolved overloaded function type>)?

32
Meraj al Maksud

Nach cppreference :

Beim Parsen eines Ausdrucks wird ein Operator, der in einer Zeile der obigen Tabelle mit einer Priorität aufgeführt ist (wie in Klammern), enger an seine Argumente gebunden als jeder Operator, der in einer Zeile weiter unten mit einer niedrigeren Priorität aufgeführt ist. Zum Beispiel werden die Ausdrücke std::cout << a & b Und *p++ Als (std::cout << a) & b Und *(p++) analysiert und nicht als std::cout << (a & b) oder (*p)++.

Operatoren mit derselben Priorität sind an ihre Argumente in Richtung ihrer Assoziativität gebunden. Zum Beispiel wird der Ausdruck a = b = c Als a = (b = c) und nicht als (a = b) = c Analysiert, da die Zuordnung von rechts nach links erfolgt, sondern a + b - c analysiert (a + b) - c und nicht a + (b - c) wegen der Assoziativität von Addition und Subtraktion von links nach rechts.

Die Assoziativitätsspezifikation ist für unäre Operatoren redundant und wird nur der Vollständigkeit halber angezeigt: Unäre Präfixoperatoren assoziieren immer von rechts nach links (delete ++*p Ist delete (++(*p))) und unäre Postfixoperatoren assoziieren immer von links nach rechts (a[1][2]++ Ist ((a[1])[2])++). Beachten Sie, dass die Assoziativität für Mitgliederzugriffsoperatoren von Bedeutung ist, obwohl sie mit unären Postfix-Operatoren gruppiert sind: a.b++ Wird analysiert (a.b)++ und nicht a.(b++).

Die Priorität des Bedieners bleibt von der Überlastung des Bedieners unberührt. Beispielsweise wird std::cout << a ? b : c; Als (std::cout << a) ? b : c; Analysiert, da die Priorität der arithmetischen Linksverschiebung höher ist als der bedingte Operator.

0
Meraj al Maksud