The thing is, a new type would be able to avoid the big design problem with `optional<T&>`: the meaning of assignment. `optional`, by design, is meant to be rebindable, modifiable. You can empty it, put a new value into it, copy a new value into its current value.
So a hypothetical `optional<T&>` ought to be rebindable too. But what does assignment mean in that context? If you assign a glvalue to an unengaged `optional<T&>` it should take a reference to it. But if you assign to an engaged `optional<T&>`, will it take a reference or copy the value? Some would expect assignment to always take a reference, and some will expect assignment to copy or reference based on engagement. Some might even expect it to always copy the value, since that's how `optional<T>` works; presumably on an unengaged `optional<T&>`, you get an exception.
Boost provides one answer, but what makes it the right answer? There are plenty of people on both sides who have valid viewpoints, and regardless of which side you pick, someone is going to get it wrong.
However, if you create some alternative `select` type, it could by design not be rebindable/assignable. Even for value types. So when you create it, you either provide a value/reference, and the `select<T>` will forever either be engaged or not engaged. The binding is immutable. If you move-construct from a `select<T>`, it will not leave the former object unengaged; it will merely move from the engaged value.
After all, look at this `variant` case. We don't need the return value of such a function to have mutable bindings. It's perfectly fine for our needs if that object is forever associated with the `variant`.
Armed with such a type, we no longer have to deal with the questions of `optional<T&>`'s assignment behavior. It might be cleaner to only have one type, yes. But since `optional` is expected to have mutable bindings, and that expectation does not play nice with references, it is best to have an alternative object for cases where bindings don't need to be mutable.