http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57691
--- Comment #2 from Jonathan Wakely <redi at gcc dot gnu.org> --- I think this is due to a horrible hack in the front end which adds implicit extern "C" blocks around system headers, and a side-effect is that function prototypes of the form 'T f()' are treated as 'T f(...)' as in C, not 'T f(void)' as C++ requires. See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50982#c40 for another case where this bit us. This is a terrible terrible hack IMHO, and should be disabled in libstdc++ headers, because when we write void(*)() we damn well mean it, we don't mean something different. Having to use void(*)(void) is an abomination.