lebensdauer von rueckgabe werten (stichwort: alias)
-
kleine verständisfrage zu rückegabtypen in verbindung mit aliasen:
class Klass{ public: Klass() : m_i(20) { m_vec.resize(10,30); } int foo() { return 10; } int& refFoo() { return m_i; } std::vector<int> vecfoo() { std::vector<int> tmp(10,-50); return tmp; } std::vector<int>& refVecFoo() { return m_vec; } int m_i; std::vector<int> m_vec; }; int main() { Klass a; //alias auf referenz ist natürlich kein thema int& alias1 = a.refFoo(); //alias ist nicht standardkonform, da lebensdauer //von rueckgabewert undefiniert -> compilerfehler (ausser bei cl ;-) ) int& alias2 = a.foo(); //wie sieht es mit sowas aus: //ist das std-konform? std::cout << (int)a.vecFoo().size() << std::endl; //oder muss ich hier std::vector<int> kopie = a.vecFoo(); std::cout << (int)kopie().size() << std::endl; //machen? //das hier auf jeden fall std::cout << (int)a.vecRefFoo().size() << std::endl; }
-
Der Rückgabewert einer Funktion überlebt zumindest bis zum Ende des Ausdrucks, in dem die Funktion aufgerufen wurde. Und an einen const-Referenz Parameter kannst du auch eine temporäre Variable übergeben.
Oder im Klartext: Die erste Variante ist standardkonform.
(das Problem bei "int& alias = a.Foo();" ist, daß der Alias das Ende dieser Anweisung überlebt - die Variable, auf die er verweist, aber nicht)
-
danke, CStoll!