This is one area where I think Rust has a clear advantage of no baggage. They get to represent Some(T) as a null pointer in the None case.
I will say that having being exposed to Rust's Enums(sum types) I don't think I can ever go back. Combined with pattern matching it's a hell of a combo.
As someone with twenty years of C++ experience, I will say I don't see why that would be difficult to implement in C++... it doesn't even seem hard... it is the kind of thing I would have been writing over ten years ago, actually: you just have a partial template specialization of a private base class that takes a boolean predicate as a template parameter to check for "one of these types has a sentinel value and the other type can be represented as a sentinal value" (you could even keep a count of sentinal as you lay out multiple types: count up the number that can be represented as sentinels and then verify all types have at least that many available sentinels; some types could seriously be friendly and provide a near infinite number of sentinels do to having otherwise invalid states, and this would be quite trivially handled in a generic way any type could slot into), and then you can use the null-or-not to collapse the storage of Some(T) and None.
It seems like that wasn't the case for the proposed C++ variant. It seems like you would have to use some sort of sentinel value to discriminate between None and Some(or virtual which is even worse).
Rust explicitly omits the sentinel value and leaves it to the compiler so that it can decide how to optimize best.
I'm just saying you wouldn't use std::variant<T star>, you'd just use T star. Also C++ has the meta-programming capabilities to special variant for pointers.
boost::variant is really interesting and useful in my opinion but it seems to increase compile times exponentially (to say nothing of compiler error messages) ... If a language based variant in C++ could solve those issues then I think that would be really great.
I will say that having being exposed to Rust's Enums(sum types) I don't think I can ever go back. Combined with pattern matching it's a hell of a combo.