Es gibt wenig Wert bei der Zugabe constQualifikationen nicht-reference / Nicht-Zeiger rvalues, und kein Punkt in Zugabe zu Einbauten.
Im Fall von benutzerdefinierten Typen , eine constwird Qualifizierungs Anrufer verhindert eine nicht Aufruf constMemberfunktion auf dem Objekt zurückgegeben. Zum Beispiel gegeben
const std::string foo();
std::string bar();
dann
foo().resize(42);
wäre verboten, während
bar().resize(4711);
wäre erlaubt.
Für Einbauten wie intmacht dies überhaupt keinen Sinn, da solche Werte sowieso nicht geändert werden können.
(Ich erinnere mich jedoch an Effective C ++ , in dem es darum ging , den Rückgabetyp operator=()einer constReferenz zu erstellen, und dies ist zu berücksichtigen.)
Bearbeiten:
Es scheint, dass Scott diesen Rat tatsächlich gegeben hat . Wenn ja, dann finde ich es aus den oben genannten Gründen selbst für C ++ 98 und C ++ 03 fraglich . Für C ++ 11 halte ich es eindeutig für falsch , wie Scott selbst herausgefunden zu haben scheint. In den Errata für Effective C ++, 3. Aufl. schreibt er (oder zitiert andere, die sich beschwert haben):
Der Text impliziert, dass alle By-Value-Rückgaben const sein sollten, aber Fälle, in denen Nicht-Const-By-Value-Rückgaben ein gutes Design haben, sind nicht schwer zu finden, z. B. Rückgabetypen von std :: vector, bei denen Aufrufer Swap mit einem leeren Vektor verwenden um den Inhalt des Rückgabewerts zu "greifen", ohne ihn zu kopieren.
Und später:
Durch das Deklarieren von Rückgabewerten für By-Value-Funktionen const wird verhindert, dass sie an rvalue-Referenzen in C ++ 0x gebunden werden. Da rvalue-Referenzen dazu dienen, die Effizienz von C ++ - Code zu verbessern, ist es wichtig, das Zusammenspiel von const-Rückgabewerten und die Initialisierung von rvalue-Referenzen bei der Angabe von Funktionssignaturen zu berücksichtigen.