What is GenericValue for?

I’m trying to figure out the data structures used for partial interpretation, and noticing that GenericValue is a container for a value of arbitrary type. But as I understand it,
the same could also be said of ConstantExpr. What exactly does GenericValue do, that ConstantExpr does not?