http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49399
--- Comment #4 from Jarryd Beck <jarrydb at cse dot unsw.edu.au> 2011-06-14 12:21:15 UTC --- (In reply to comment #3) > The program should not compile. > > In C++03 it should fail to compile because it accesses a private member. > SFINAE > does not take access control into account in C++03, so that is an error. G++ > fails to reject the program because access checking in templates is buggy. > > There was a last minute change in the C++0x FDIS to make SFINAE consider > access > control. The previous draft > (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf) says in > section 14.8.2 [temp.deduct] p8 "Access checking is not done as part of the > substitution process. Consequently, when deduction succeeds, an access error > could still result when the function is instantiated." > That was changed in the FDIS, so accessing the private member should cause > deduction to fail, so there is no broken_fun and the call to it in main should > fail. G++ 4.7 doesn't implement that change yet, so rejects the program for > the wrong reason. > > If you had a second, less specific, overload of broken_fun then the program > would still be invalid in C++03 but should be well-formed in C++0x. G++ > doesn't > accept it because access checking is not done as part of the substitution > process yet. > > e.g. this is valid C++0x > > struct broken > { > private: > typedef int value_type; > }; > > template <typename T> > int > broken_fun(int, typename T::value_type* = 0); > > template <typename T> > char > broken_fun(...); > > int main(int argc, char* argv[]) > { > > return sizeof(broken_fun<broken>(5)); > } Ah, I see. Well the example you gave also doesn't compile. This is exactly what the boost library does too, I missed that part in their code, meaning that parts of boost no longer compile with gcc 4.7.