zwracanie referencji do zmiennej lokalnej

0
#include <iostream>
#include <utility>
std::pair<int, char> &foo()
{
    std::pair<int, char> p(4, 'd');
    return p;
}
int main()
{

    std::pair<int, char> p = foo();
    foo();
    std::cout<<p.first<<"\n";
    p.first = 99;
    std::cout<<p.first<<"\n";
    return 0;
}
 

Rozumiem, że to, że ten kod nie wywala się nie znaczy, że jest poprawny ? Czy takie zwracanie jest poprawne ? Program działa

0

Jest bardzo niepoprawny. Wywołujesz undefined behaviour.

edit: na ideone nie działa: http://ideone.com/IRvH3Y (chociaż dociekanie co się dzieje z programem po wywołaniu UB nie ma sensu - od momentu wywołania UB nie ma gwarancji deterministycznego zachowania)

1

Prawdopodobnie chciałeś zrobić takie coś:

#include <iostream>

std::pair<int, char> foo9() { return std::pair<int, char> p(4, 'd'); }
std::pair<int, char> foo8() { return foo9(); }
std::pair<int, char> foo7() { return foo8(); }
std::pair<int, char> foo6() { return foo7(); }
std::pair<int, char> foo5() { return foo6(); }
std::pair<int, char> foo4() { return foo5(); }
std::pair<int, char> foo3() { return foo4(); }
std::pair<int, char> foo2() { return foo3(); }
std::pair<int, char> foo1() { return foo2(); }
std::pair<int, char> foo() { return foo1(); }

int main()
  {
   std::pair<int, char> p=foo();
   return 0;
  }

Ale zapewniam że takie coś:

#include <iostream>

int main()
  {
   std::pair<int, char> p(4, 'd');
   return 0;
  }

ewentualnie takie coś:

#include <iostream>

int main()
  {
   std::pair<int, char> p=std::pair<int, char>(4, 'd');
   return 0;
  }

zadziała identycznie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1