http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49812
--- Comment #2 from Jason Merrill <jason at gcc dot gnu.org> 2011-08-05 14:42:00 UTC --- operator++ isn't returning void. The problem is that GCC is treating it as a volatile prvalue, which can't bind to either const volatile int& or const int&. But int prvalues shouldn't have cv-quals.