https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57846
Harald van Dijk <harald at gigawatt dot nl> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |harald at gigawatt dot nl --- Comment #3 from Harald van Dijk <harald at gigawatt dot nl> --- Somewhat reduced: template <typename T> struct A { template <typename T2> void f(); }; template <typename T> struct B { int &f() const; template <typename T2 = T, typename = decltype(A<T2>().template f<T2>(T2()))> void f(); void g() { int *i = &B<int>().f(); } }; Accepted by clang 3.4.2, rejected by gcc 4.8.3 and 4.9.0 with: test.cc: In member function ‘void B<T>::g()’: test.cc:17:26: error: lvalue required as unary ‘&’ operand It seems to only happen when certain operators are used: there is no error when doing e.g. int &i = B<int>().f();