http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58569
--- Comment #3 from Daniel Krügler <daniel.kruegler at googlemail dot com> --- (In reply to Paolo Carlini from comment #1) [Somehow bugzilla lost my response] Yes, foo is incomplete within a data member declaration of type foo and this breaks std::is_convertible, because the arguments are not complete types. On the other hand the user seems not to violate 17.6.4.8 [res.on.functions], because foo() and foo(int) are both complete types. I don't see a good reasons why std::function<foo(...)> should check std::is_convertible<foo, foo> when instantiating the class template.