Bez Copy traitu by to byl dost opruz. To by totiž najednou bylo potřeba psát .clone() i u věcí jako u64, a to asi opravdu nikdo nechce - nepřeložilo by se třeba ani tohle:
let a = 3;
let b = 4;
let c = if a > b { a } else { b };
println!("Max of {a} and {b} is {c}");
a musel bys psát
let a = 3;
let b = 4;
let c = if a > b { a.clone() } else { b.clone() };
println!("Max of {a} and {b} is {c}");
Rozumím. Je to asi největší confusion co mi Rust dělá, některé objekty se přesouvají některé se nepřesouvají. Primárně se to stále chová jako matematická rovnice, kde proměnné se umí kopírovat a kde x=y znamená, že x má stejnou hodnotu jako y. Ale běda, pokud y je move only object.
Pak z hlediska čitelnosti mi dává větší smysl
x=std::move(y)
ať už x a y je cokoliv.
Jen dodám, že si pamatuju před vynálezem std::move jsem používal operátor <<
x << y (přesun y do x) - x musela být reference
Místo std::vector se v jedné herní firmě používal AutoArray<T>, který měl definovaný traits pro T, a jednou z nich bylo - binary movable.
Stejně tak ve své knihovně jsem měl vlastní funkci moveObject(T &, void *ptr), který přesunul první argument na adresu ptr, první argument byl považován za zdestruovaný a celé se to řídilo Traits toho typu. Pokud nebyly definované, funkce udělala placement new(ptr) s copy constructorem na T a zavolala destruktor na původní proměnnou.
Intenzivně se zabývám programováním zejména v jazyce C++. Vyvíjím vlastní knihovny, vzory, techniky, používám šablony, to vše proto, aby se mi usnadnil život při návrhu aplikací. Pracoval jsem jako programátor ve společnosti Seznam.cz. Nyní jsem se usadil v jednom startupu, kde vyvíjím serverové komponenty a informační systémy v C++
Přečteno 53 737×
Přečteno 25 575×
Přečteno 23 821×
Přečteno 22 330×
Přečteno 22 270×