Das folgende Codebeispiel Verhalten ist nicht definiert ..undefinierte Verhalten von std :: string, wenn c_str() verwendet
char * getName()
{
std::string name("ABCXYZ");
return name.c_str();
}
Dies liegt daran, Name den Gültigkeitsbereich verlässt. Aber ich wollte verstehen, wie es anders ist, wenn wir eine std :: string zurückgeben und nicht undefiniertes Verhalten erzeugen?
Wenn Sie es (den 'std :: string') nach Wert zurückgeben, wird es kopiert/verschoben, also ist es nicht UB. – tkausl
Die Rückgabe einer 'std :: string 'würde aller Wahrscheinlichkeit nach nichts kopieren; Der Rückgabewert wird nach Möglichkeit an Ort und Stelle erstellt. C++ 17 garantiert das sogar manchmal. Wenn das nicht möglich ist, wird die Zeichenfolge zumindest ausgezogen anstatt kopiert. Es gibt wirklich nicht viel zu befürchten. – chris
Es ist eine wohlbekannte C++ - Richtlinie, dass Sie lokale Objekte niemals durch Referenz (oder Zeiger) zurückgeben sollten. Sie können mehr darüber in Effective C++ lesen, aber die Erklärung von David Schwartz deckt das meiste davon ab. –