I feel like correctly doing in-place initialisation with this approach requires the ability to do a strong update – you take a reference to an uninitialised MaybeUninit and return a reference to an initialised value within it, but somehow prove that they're the same reference so that the caller can treat the referenced value as now having a different type. (The thread I linked has some discussion about doing those proofs in the type system, but I guess it could be as simple as "conceptually do an address comparison, but it gets optimised out".)