https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71879
bogdan <inadgob at yahoo dot com> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |inadgob at yahoo dot com --- Comment #2 from bogdan <inadgob at yahoo dot com> --- (In reply to Jonathan Wakely from comment #1) > Taking the address of Foo::foo<Caller> instantiates it, which results in an > error outside the immediate context, so you get an error not a substitution > failure. Yes, GCC tries to instantiate the definition of the specialization, but I don't think it should. [temp.inst]/3: Unless a function template specialization has been explicitly instantiated or explicitly specialized, the function template specialization is implicitly instantiated when the specialization is referenced in a context that requires a function definition to exist. [...] [temp.inst]/8: An implementation shall not implicitly instantiate a function template, a variable template, a member template, a non-virtual member function, a member class, or a static data member of a class template that does not require instantiation. [...] I don't think forming a pointer to a member function as an operand to decltype like in this example should, by itself, require the function's definition to exist; after all, we're only interested in the type. In this case, determining it doesn't require deduction of any placeholder type or evaluation of any constant expression. I don't see how the definition could influence the resulting type. In terms of odr-use, the template-id for the specialization appears as a subexpression of an unevaluated operand, so it's not potentially evaluated, so [basic.def.odr] doesn't require a definition. The example works on Clang, EDG and MSVC, so none of them attempts to instantiate the definition.