https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106223
--- Comment #5 from Jonathan Wakely <redi at gcc dot gnu.org> --- (In reply to Nimrod from comment #2) > Quoted from https://timsong-cpp.github.io/cppwp/n4659/namespace.std#2 > > "A program may explicitly instantiate a template defined in the standard > library only if the declaration depends on the name of a user-defined type > and the instantiation meets the standard library requirements for the > original template." That paragraph has nothing to do with your case, you are adding a specialization, not an explicit instantiation. If the standard allows this nonsense then it needs to be fixed. std::move and std::forward are effectively built-in language primitives, and you should not be messing with them.