Earlier quoted context omitted.
I think Zig prefers explicit memory management, because allocations may fail and should be handled explicitly, and because automatic deallocations lead to hard-to-predict lifetimes (excess memory usage, and bugs for resource handles that are destructed at hard to predict moments). These are things that a "systems language" programmer should put in the work to do correctly/near-optimally, and not ask the compiler to j…
The lifetime of the memory a smart pointer manages is very predictable. It will have the same lifetime as the smart pointer itself (this is ignoring moves).
pub enum List { Empty, Elem(i32, Box), }
instead of :
pub struct List { head: Link, }
enum Link { Empty, Some(Box), }
struct Node { elem: i32, next: Link, }