Aktywne Wpisy
czykoniemnieslysza +166
Tak wyglądały kiedyś pociągi, teraz wydają się brzydkie ale mimo wszystko kojarzą mi się z młodzieńczym luzem i przygodą
#wykop30plus
#wykop30plus
źródło: temp_file5049304182362895122
Pobierz
MateuszLakomy +219
Jak pewnie państwo wiedzą, kilka dni temu GUS ogłosił, że współczynnik dzietności w Polsce wyniósł w 2023 r. 1,158 dzieci na kobietę. Oznacza to, że „statystyczna” Polka w ciągu całego swojego życia urodzi mniej niż 1,2 dziecka. To najmniej w historii Polski i daleko poniżej wartości, która potrzebna jest do tzw. „zastępowalności pokoleń”, czyli liczby dzieci gwarantującej stabilność liczby ludności.
Żeby tak było, kobieta powinna urodzić średnio ok. 2,1 dziecka.
Coś o
Żeby tak było, kobieta powinna urodzić średnio ok. 2,1 dziecka.
Coś o
źródło: 24_05_21_Urodzenia i dzietnosc 1950-2023
Pobierz




Mirki, żaden ze mnie ekspert w tej dziedzinie i dlatego postanowiłem aż się o to zapytać. Chodzi mi o funkcję std::move(). Ja rozumiem po co nam są move konstruktory, żeby nie kopiować obiektów tymczasowych a ukraść im bebechy i oszczędzić programowi roboty, szczytny cel.
Ale może mi ktoś podać jeden dobry przykład, kiedy ktoś zdrowy w ciele i umyśle chciałby użyć std::move()? Bo ta funkcja rozkazuje traktować lvalue jako rvalue (z tego co zrozumiałem z tłumaczeń gościa na yt, bo aż oglądam tutki myśląc, że chyba czegoś nie rozumiem, skoro działanie nosi znamiona bezsensu), czyli "udawaj, że jesteś tymczasowy na potrzeby move konstruktora". Efekt jest taki, że w jak mamy stary vector o nazwie "dupa" i zrobimy std::vector dupa2 (std::move(dupa)); to mówiąc krótko zmienimy nazwę z dupa na dupa2 i jeszcze w gratisie uzyskamy pusty vector o starej nazwie, którego użycie prawdopodobnie wysypie nam program.
Albo gość nie powiedział wszystkiego, albo ja po prostu nie mam pojęcia czemu miałbym tego używać tworząc chaos i problemy.
unique_ptr: nie możesz go skopiować bo ma być unikalny, ale możesz go przenieść. Przykładowo możesz zrobić std::swap z pustym obiektem, z tego triku korzystało sporo bibliotekC++03. Niestety w przypadku przekazywania parametrów, nie da się tego wykorzystać bo wartość tymczasowa (rvalue) przekazuje się jakoconst&czyli swapa nie zrobisz. Dlatego powstał osobny typ rvalue,Z
std::movekorzysta się sporadycznie, on tak naprawdę nic nie robi jedynie casta referencji. Destruktor tak czy siak się wywoła. Już częściej chybastd::forwardsię korzysta.std::movez konstruktorem klasy przyjmującym rvalue. Te się akurat często stosuje.class Foo
{
std::string name;
public:
Foo(std::string name) : name(std::move(name)) {}
}
vs
class Foo
{
std::string name;
public:
Foo(const std::string& name) : name(name) {}
}
Drugi przypadek i tak zawsze wykona kopie stringa w liscie inicjalizacyjnej. Pierwszy jest uzależniony od tego jak wywołasz konstruktor (może nie być kopii, jeśli argument wychodzi ze scopu, albo jest również przenoszony std::move)
&&. Znaczy nie musi być kopii ale konstruktor przenoszenia wykona się dwa razy.@Khaine: Dlatego zazwyczaj stosuje się szablony żeby wszystko się samo uprościło, obejrzyj sobie Meyersa:
https://channel9.msdn.com/Shows/Going+Deep/Cpp-and-Beyond-2012-Scott-Meyers-Universal-References-in-Cpp11
@Khaine: Kiedy nie wiesz czy masz referencje rvalue czy lvalue.