To start:
__consuming
just means thatself
is__owned
, in much the same way thatmutating
meansself
isinout
.- When I talk about “copying” below, think “retain” for an object; when I talk about “destroying”, think “release”.
__owned
means that the callee will destroy the value, so the caller should consider it unusable once the callee returns. The caller can handle this by either copying the value before passing it (the default) or ending its lifetime so it can no longer be used (what happens if you use move
).
The alternative is that the callee will not destroy the value, so the caller can keep using it once the callee returns. This means that, if there’s a copy, it will be in the callee, not the caller. The caller can still use move
, but it won’t actually eliminate the copy; the callee will still copy the original, but the caller will destroy the original once the callee returns.
So basically, __owned
means that if you do move
the value in, that will truly eliminate a copy. But using __owned
by itself doesn’t eliminate the copy; it just allows the caller to eliminate it.