Владимир качи първо решение на 19.10.2025 20:36 (преди 11 дена)
Обясни защо в случая с i32 е възможно да използваме x след извикване, но не можем да използваме s след duplicate_string:
Примитивният тип i32 използва семантика на копирането - при присвояване се прави побитово копие на стойността като и старата и новата променлива могат да се използват. Тип String използва семантика на преместването - побитово копиране на стойността от едно място в паметта на друго, забравяне на старата памет (след присвояване, старата променлива не може да се използва). Семантиката на преместване важи и когато подаваме аргументи на функции.
Какво става, ако duplicate_string върне (s, s) — защо компилаторът го забранява?
За първия елемент на двойката, съдържанието на s бива успешно преместено. Обектът s (подадения като параметър във функцията) остава празен. При вторият елемент от двойката обаче първоначалният s, който се опитваме да върнем повторно, вече е бил преместен и в резултат на това получаваме компилационна грешка.
