Ist die Rücksendung einer Referenz jemals eine gute Idee?

Wir alle wissen dasEs ist eine schlechte Idee, einen Verweis auf eine lokale Variable zurückzugeben. Ich frage mich jedoch, ob es jemals wirklich eine gute Idee ist, eine Referenz zurückzugeben und ob es möglich ist, einige gute Regeln zu bestimmen, wann oder wann nicht.

Mein Problem bei der Rückgabe einer Referenz ist, dass die aufrufende Funktion sich um die Lebensdauer eines Objekts kümmern muss, für das sie nicht verantwortlich sein sollte. Als konstruiertes Beispiel:

#include <vector>

const int& foo() {
  std::vector<int> v = {1, 2, 3, 4, 5};
  return v[0];
}

int main(int argc, const char* argv[])
{
  const int& not_valid = foo();
  return 0;
}

Hier dievector erlischt am Ende vonfoo, seinen Inhalt zu zerstören und alle Verweise auf seine Elemente ungültig zu machen.vector::operator[] gibt einen Verweis auf das Element zurück, und wenn dieser Verweis weiter zurückgegeben wird, wird ausfoo, die Referenz inmain baumelt. Ich glaube nicht, dass die const-Referenz die Lebensdauer hier verlängern wird, da es sich nicht um eine temporäre Referenz handelt.

Wie gesagt, dies ist ein erfundenes Beispiel und der Schreiber vonfoo wahrscheinlich wäre es nicht so dumm, zu versuchen, zurückzukehrenv[0] Als Referenz. Es ist jedoch leicht zu erkennen, wie der Aufrufer beim Zurückgeben einer Referenz auf die Lebensdauer eines Objekts achten muss, das er nicht besitzt. Ein Element in a schiebenvector kopiert es, also dann dievector ist dafür verantwortlich. Dieses Problem tritt bei der Übergabe eines Referenzarguments nicht auf, da Sie wissen, dass die Funktion abgeschlossen ist, bevor der Aufrufer fortfährt und das Objekt zerstört.

Ich kann sehen, dass das Zurückgeben einer Referenz einige nette Array-ähnliche Syntax wie ermöglichtv[0] = 5 - Aber was ist so schlimm daran, eine Mitgliederfunktion zu haben?v.set(index, value)? Zumindest würden wir damit die internen Objekte nicht belichten. Ich weiß, dass es auch eine Leistungssteigerung geben kann, wenn eine Referenz zurückgegeben wird, aber mitRVO, RVO (NRVO) genannt, und die Bewegungssemantik ist entweder vernachlässigbar oder nicht vorhanden.

Ich habe versucht, mir vorzustellen, unter welchen Umständen das Zurückgeben einer Referenz jemals wirklich sicher ist, aber ich kann mich nicht mit all den verschiedenen Permutationen der Besitzersemantik befassen, die damit verbunden sein könnten. Gibt es dafür gute Regeln?

Hinweis: Ich kenne einen besseren Weg, um mit Eigentum umzugehenvectors ist es, intelligente Zeiger zu verwenden, aber dann haben Sie das gleiche Problem mit einem anderen Objekt - wem gehört der intelligente Zeiger?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage