As mentioned by @pervognsen , C++20 allows floats as template parameters. But. But! If you look at the Itanium C++ ABI, you'll see that it has been describing mangling rules for floats since the beginning.

Hence, a puzzle: how is it possible to write an entity that contains a float in its mangled name in C++98?

I had no idea, so after a bit of searching I found one revelatory example, and reproduced the idea in this CE sample: https://godbolt.org/z/1Wcfeqb58

But I still have no idea why it is mangled like that. Surely it's possible to fully fold the parameters when instantiating the templates, and write 1 instead of 0+1 and (int)(0+0x1p0)? Am I overlooking yet another subtlety?

Compiler Explorer - C++ (x86-64 gcc 15.1)

template <int I> struct S {}; template <int N> void f1(S<N+1> *); template <int N> void f2(S<int(N+1.)> *); void g() { f1<0>(0); f2<0>(0); }