std::any_cast
is specified in terms of typeid
. To quote cppreference on this:
Throws std::bad_any_cast
if the typeid
of the requested ValueType
does
not match that of the contents of operand.
Since typeid
doesn't allow the implementation to "figure out" an implicit conversion is possible, there's no way (to my knowledge) that any_cast
can know it's possible either.
To put it otherwise, the type erasure provided by std::any
relies on information available only at run-time. And that information is not quite as rich as the information the compiler has for figuring out conversions. That's the cost of type erasure in C++17.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…