A megoldáshoz fontos, hogy tudatosítsuk: a túlterhelt operátorok tulajdonképpen függvények (leszámítva a speciális kiértékelést híváskor és a speciális szintaxist). Ez azt jelenti, hogy lokális változó/érték szerint átvett argumentum címét továbbra sem szolgáltathatjuk ki a függvényen kívülre sem pointeren sem referencián keresztül. Ez a hiba futási időben jön elő, bár warningot kapunk. (SzC++Ny 2.4 fejezet).
A másik fontos dolog az = operátor és a másolókonstruktor közötti összefüggés: ha a másolókonstruktorból az =operátort hívjuk, akkor az = operátorban nem használhatunk érték szerinti átadást, hiszen az a másolókonstruktor további hívását jelentené, amely végtelen ciklust eredményezne (SzC++Ny 6.4 fejezet eleje). Mivel a fordító ezt nem ellenőrzi (warningot itt is ad), ez a hiba is csak futási időben derül ki a verem túlcsordulásával, ami a végtelen rekurzió következménye.
Megjegyezzük még, hogy a hiba többféleképpen kijavítható, bármely megoldás ugyanolyan mértékben elfogadott, az „elegánsabb” megoldások a szokásos megoldásra próbálnak rámutatni.
Ezek után vegyük sorra a feladatokat!
a)
Itt az =operátort hívjuk a másolókonstruktorból, vagyis érték szerinti paraméterátadás az operátor=-ben végtelen ciklust okoz. A paraméterlistában pontosan ez történik, amennyiben a paramétert referencia szerint vesszük át, akkor kijavítjuk a hibát.
b)
Itt a hiba nagyon hasonló az előzőhöz, csak itt a visszatérési értéket kell referencia szerint visszaadnunk.
c)
Itt egy érték szerint átadott argumentumot adunk vissza referencia szerint. Vagy érték szerint kell visszaadnunk, vagy referencia szerint kell átvennünk. Különösen elegáns, ha konstans referenciaként vesszük át, ez a megoldás a + operátor szokásos használatát is figyelembe veszi. (A mellékhatás a + operátor argumentumain ritkán tekinthető követendő megoldásnak.)
d)
A kódrészlet egy lokális változót ad vissza referencia szerint. A hiba javításaként érték szerint kell visszaadnunk a lokális változót, és nem referencia szerint.
e)
A kódrészlet az a) és b) feladat hibáit egyesíti. A hiba javítása is azonos: referencia szerint vesszük át az argumentumot, és referencia szerint térünk vissza.
f)
A kódrészletben található hiba megegyezik a c) feladatnál tapasztalttal. Az ott bemutatott megoldások helyesek, ugyanakkor mivel az = operátorról van szó, konstans referenciaként vesszük át a paramétert, ez a szokásos megoldás.
g)
Itt a d) példával analóg a hiba, javítása ugyancsak érték szerinti visszatéréssel.
h)
Ebben a feladatban nincs benne a másolókonstruktor, vagyis elképzelhető, hogy nem hívja az = operátort. Nem szép megoldás, ne kövessük, de nem is hiba. Viszont az s1=s2=s3 kifejezés átírva:
operator = (s1, operator= (s2, s3))
Ebből az alakból jól látható, hogy az =operátornak szükség van a visszatérési értékére, amely pedig void. A függvényhívás paramétereinek biztosítása a fordító (compiler) feladatkörébe tartozik, ezért ez fordítási hiba. Egy másik fordítási hiba, hogy void visszatérésű függvény nem térhet vissza értékkel. A javítást valamelyest a példa is sugallja: a visszatérési értéket javítsuk String&-ra, és különösen elegáns konstans referenciával visszatérni, bár a példában az érték szerinti paraméterátvétel meglehetősen nehézzé teszi az elegáns végeredményt csak a hibákat javítva.
i)
A kódrészlet ismét variáció egy témára (c), f)): érték szerint átvett argumentummal térünk vissza referencia szerint. A problémát a szokásos módszerrel orvosolhatjuk, a legelegánsabb a konstans referencia szerinti paraméterátadás.