Czas życia obiektów tymczasowych - parametry funkcji

0

Mam takie coś:

struct Foo
{
   Foo() { ... };
   Foo* This() { return this; }
};

struct Base()
{
   fastcall_lub_cdecl Base(Foo *foo) { ... }
};

struct Derived()
{
   fastcall_lub_cdecl Derived() 
      : Base(Foo().This()) //<--- TU
   { ... }
};

Na pewno nie zniszczy obiektu Foo przed skończeniem konstruktora Base ? Nie mogę się doszukać jak to jest w standardzie C++.
Pytam, bo kod ma być na wieeeele platform (od Win/Nix przez Mac, Amiga po Nokia, PSP ...)

Gdzieś się doczytałem, że obiekty tymczasowe żyją dopóki całe wyrażenie nie zostanie wykonane. Czyli było by niby ok. Ale ? Właśnie, jest jakieś ale ?

0

Nie powinien niszczyć, to jest poprawna konstrukcja.

0

Jeśli nie zapamiętujesz tego wskaźnika, by potem go gdzieś użyć, to wszystko jest OK.
Szczerze powiem, ta funkcja This() działa mi na nerwy.
Nie lepiej zastosować referencję:

struct Base()
{
   fastcall_lub_cdecl Base(const Foo &foo) { ... }
};

To jest zwyczajowa polityka w takich wypadkach.

0
MarekR22 napisał(a)

Szczerze powiem, ta funkcja This() działa mi na nerwy.
Nie lepiej zastosować referencję:

struct Base()
{
   fastcall_lub_cdecl Base(const Foo &foo) { ... }
};

To jest zwyczajowa polityka w takich wypadkach.

To jest tylko modyfikacja (patch) open-source'owego projektu (OpenTTD), a klasa Base to istniejąca w nim od dawien dawna klasa bazowa wszystkich okien więc jej nie ruszam jak nie muszę. Raz że ten patch pewnie kiedyś będzie włączony na stałe, a dwa - żeby się nie gryzło z innymi patch'ami i można było je możliwe łatwo łączyć.

Klasa Base, a właściwie Window przyjmuje w konstruktorze przez const-wskaźnik strukturę opisującą jej wygląd i zawartość, interpretuje ją i zostawia w spokoju więc wskaźnik nie jest zapisywany. Ja potrzebowałem przekazać tą strukturę deczko zmodyfikowaną więc robię tymczasową kopię.

0
adf88 napisał(a)

To jest tylko modyfikacja (patch) open-source'owego projektu (OpenTTD)

Fakt, to lepiej tego nie ruszać. W sumie to jestem ciekawy jak kompilator zareagowałby na operator & zastosowany na obiekcie automatycznym? Raczej zastrajkuje. Jak będę miał chwilkę to sprawdzę.

offtop: Fajna gierka, kiedyś straciłem na nią trochę życia ;) .

0
MarekR22 napisał(a)

W sumie to jestem ciekawy jak kompilator zareagowałby na operator & zastosowany na obiekcie automatycznym? Raczej zastrajkuje. Jak będę miał chwilkę to sprawdzę.

offtop: Fajna gierka, kiedyś straciłem na nią trochę życia ;) .
Może warningiem rzucić "Taking address of temporary".

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