Klicken Sie Zeilen an, die mit + markiert sind. Dort ist Hilfeinformation hinterlegt.
Ohne Zeile 10 müsste man htwg::string::string() schreiben.
Auch für den leeren String muss Speicher reserviert werden, und zwar mit new[], damit man in den anderen Funktionen keine Fallunterscheidungen für leere Strings braucht und im Destruktor immer delete[] richtig ist.
Die Sprachspezifikation verlangt, dass das temporäre Objekt that in einem zwar undefinierten, aber konsistenten Zustand hinterlassen wird. Zwingend ist, dass der Destruktor bei dem "bestohlenen" Objekt nicht abstürzt. Das tut er hier nicht, weil delete[] nullptr erlaubt ist. Einige andere Memberfunktionen würden allerdings mit nullptr abstürzen, sollten bei einem temporären Objekt aber auch nicht aufgerufen werden.
Implementierung analog zum Move-Konstruktor. Allerdings muss bei der Move-Zuweisung erst der alte Wert der linken Seite aufgeräumt werden. In der Praxis ist es eher üblich, hier die Werte der Membervariablen von this und that zu tauschen (die Bibliothek unterstützt das sogar mit einem Funktions-Template std::swap).
std::strcat(t, that.s) wäre langsamer, weil da zuerst in t das '\0'-Zeichen gesucht werden muss.