...and after adding the proposed mangling to G++, I get a multiply defined symbol on template <typename T> constexpr T f(const T* p) { return p[0]; } template<int> struct N { }; template <typename T> void g(T, N<f((const T*)"1")>) { } template <typename T> void g(T, N<f((const T*)"2")>) { } int main() { g('1', N<'1'>()); g('2', N<'2'>()); }