Having finally written that blog post on validity of values, I can now clarify why I think there are multiple notions of “uninhabited”: Some types do not have any valid inhabitants – they are as uninhabited as it gets. Examples are !
or any empty enum, but also (i32, !)
.
Other types do not have any safe inhabitants, but they might have valid inhabitants. An example of such a type is
struct Recursive<'a>(&'a mut Recursive<'a>);
According to my definition, Recursive(MaybeUninit::<Recursive>::get_mut())
is valid for Recursive
but not safe – there is no safe inhabitant.