Ja und nein. Wenn Du den &&-Operator überlädst, gibst Du ja die Klassen der Parameter mit an (für primitive Datentypen alleine kannst Du das nicht überladen). D.h. wenn das weiterhin boolsche Ausdrücke sind, dann passiert Dir in C++ nichts. Wenn Du aber den &&-Operator für eine Klasse Foo überlädst, und in dem obigen Beispiel machwas() ein Objekt dieser Klasse zurückgibt, dann würde in C++ der Dekrement *immer* durchgeführt werden...
Sprich: Sobald er überladen ist, gilt die überladene Variante immer. Allerdings überlädst Du ihn ja nur für spezifische Datentypen. Das macht es allerdings nicht arg weniger verwirrend.
Achso, das beim Vergleich boolscher Ausdrücke weiterhin die nicht überladene Variante gilt, hätte ich noch gewusst, trotzdem danke für die Erklärung. Woher kommt dieses Verhalten? Liegt das vielleicht daran, dass erst beide Ausdrücke ausgewertet werden müssen, um herauszubekommen, welche der Überladungen überhaupt benutzt wird?
Wenn Du auf Nummer Sicher gehen willst, kannst Du (bool)A && (bool)B machen, um explizit boolsche Ausdrücke miteinander zu vergleichen, dann wird er nie überladen.
Ist das zweite (bool) nicht überflüssig? Oder "sieht" der Compiler, dass dort auf jeden Fall zwei boolsche Ausdrücke vorliegen und nimmt nur dann die Optimierung vor?
Reden ist Silber, Schweigen ist Gold, meine Ausführungen sind Platin.
Self-Code: sh:( ch:? rl:( br:> n4:( ie:{ mo:) va:) de:> zu:} fl:| ss:| ls:~ js:|