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!


Anmelden zum Antworten