Take this (working) program
https://godbolt.org/z/rY3hh8boG
It creates a type, which remembers both types, int and double and its value:
So it does, what you propose.
However, it wraps the feature into a new type.
d -> doublei -> int11AutoWrapperIdiE -> AutoWrapper<double, int>123 -> value123 -> value
Why should this be implicitly done with existing types instead?
Lots of C++ depends on knowing the exact type.
By making two types, which were the same before suddenly different, existing code breaks.
E.g. static variables in templated functions would exist independently, where before they were shared.