LINUX.ORG.RU

История изменений

Исправление 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.