#programowanie #cpp
Dlaczego unique_ptr może być zwrócony przez funkcję przez wartość, skoro standard mówi, że zostaje on zniszczony podczas opuszczania zakresu ważności?
Dlaczego unique_ptr może być zwrócony przez funkcję przez wartość, skoro standard mówi, że zostaje on zniszczony podczas opuszczania zakresu ważności?
- Najlepsze
- Wszystkie komentarze







When certain criteria are met, an implementation is allowed to omit the copy/move construction of a class object [...] This elision of copy/move operations, called copy elision, is permitted [...] in a return statement in a function with a class return type, when the expression is the name of a non-volatile automatic object with the same cv-unqualified type as the function return type [...]
When the criteria
Nie wiem po co to gdybanie. Czyli jak dodam flagę -fno-elide-constructors, która wyłącza NRVO to nie będzie się dało zwrócić unique_ptr?
Edit: O tutaj: https://en.cppreference.com/w/cpp/language/copy_elision
Więc jeśli wchodzi RVO to nie ma w ogóle mowy o
std::unique_ptrz funkcji jest on niszczony jak słusznie zauważasz, ale zanim zostanie zniszczony to zostaje wywołany move constructor i zasób na stercie jest przekazywany temu pointerowi do którego zwracasz z tej funkcji, a oryginalny po tej opracji zostaje wyczyszczony. I to potem ten pusty uniqueptr zostaje zniszczony przez wywołanie destruktora.Tutaj jako "ładunek" masz
intzamiast pamieci na stercie która miałbys w przypadku smart pointera ale ta zasada jest ta sama.W srodku funkcji stwarzasz Cecylie z ladunkiem 3 i zwracasz ja do Aliny. Najpierw ladunek zostaje przeniesiony a potem pusta Cecylia jest niszczona. Na podobnej zasadzie dziala zwracania z unique_ptr
Patrz tylko na funkcje
main()if()