https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79504
Bug ID: 79504 Summary: Mix of perfect forwarding and reference qualifier leads to recursive template instantiation. Product: gcc Version: 7.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: Predelnik at gmail dot com Target Milestone: --- The following example seems correct to me and is accepted by msvc/clang but gcc rejects it starting from version 4.8 up to current day versions with "template instantiation depth exceeds maximum of 900". Removing trailing type helps, so it's gotta be problem with f in trailing type being the wrong one I guess. #include <utility> struct A { void f () & {} template <typename ...Args> auto f (Args &&... args) && -> decltype (std::move (this->f (std::forward<Args> (args)...))) { return std::move (this->f (std::forward<Args> (args)...)); } }; int main (){ A p; p.f (); }