std::function looks like a regular template class (like any container). And It doesn't look like we should subclass it. So, unless I'm missing something, there is no vtable.
By the way, why do we need std::function at all? Every time I saw it, it was to work around some dark corner of C++ type system or template dark magic.
Because function pointers in C++ carry no state. Given:
class A { void foo(); };
A a;
There is no such construct that lets you store a call to foo specialized for the instance 'a':
??? thing = a.foo; // doesn't exist
The only option in C++ is to take the address of the member function:
&A::foo
But even this is not sufficient as it is equivalent to:
void (*)(A * __this)
That is, the "this" pointer is not stored. Along comes mem_fun:
struct mem_fun{ A *a; void(A::*ptr)(); };
Now you can store a call to foo for the instance a:
mem_fun fun;
fun.a = &a;
fun.ptr = &A::foo;
Adding an operator() to mem_fun lets you treat a mem_fun instance as a function:
void operator()(){ a->*ptr(); }
...
fun()
Now, lets say you need to store this as a generic "callback". Well, how would you do that? Sure, you can store mem_fun instances but what about just plain function pointers? Now you can't store them. In comes std::function. With a little bit of VERY simple to understand magic, you can do:
Most programming languages implicitly type erase closures, C++ does not. Type erasure can come at the cost of heap allocation and indirect function calls. If you need type erasure in C++ you can put any callable type inside std::function.