История изменений
Исправление
Legioner,
(текущая версия)
:
При вызове f(x) забирает владение x себе. g за него больше не отвечает, можно считать, что x после вызова f(x) не определена.
Внутри f если выполнение пошло в первую ветку, x возвращается и владеть им будет тот, кто вызывал f. Т.е. владельцем станет на какой-то момент g, но она сразу же вернёт это значение в main и владельцем 20-ки станет main. После выхода из main это значение удалится.
Если выполнение пошло во вторую ветку, то возвращается новое значение 10. При этом f владеет переменной x и, соответственно, удаляет её. Дальше всё происходит как в первом варианте и в конце концов main удалит 10.
Исходная версия
Legioner,
:
При вызове f(x) забирает владение x себе. g за него больше не отвечает, можно считать, что x после вызова f(x) не определена.
Внутри f если выполнение пошло в первую ветку, x возвращается и владеть им будет тот, кто вызывал f. Т.е. владельцем станет на какой-то момент g, но она сразу же вернёт это значение в main и владельцем 20-ки станет main. После выхода из main это значение удалится.
Если выполнение пошло во вторую ветку, то возвращается новое значение 20. При этом f владеет переменной x и, соответственно, удаляет её. Дальше всё происходит как в первом варианте и в конце концов main удалит 20.