The template statement declares that it takes a type T, which I use that the type to instantiate, and then an arbitrary number of types called Args, which I use for identifying and calling the intended constructor.
The function returns a std::function that wraps a function returning T and taking as arguments the types specified by Args.
WrapCtor returns a lambda which takes the argument types specified by Args and names this list of arguments args. It returns T, of course.
Finally the return inside the lambda returns an instance of T given the parameters given by args.
It is not an exception; std::move() is a function template, and standard template argument deduction rules for function templates applies to it as well.
This is clarified on page 8 of the article:
Secondly, there is a special template argument deduction rule for function templates that take an argument by rvalue reference to a template argument:
template<typename T>
void foo(T&&);
Here, the following apply:
When foo is called on an lvalue of type A, then T resolves to A& and hence, by the reference collapsing rules above, the argument type effectively becomes A&.
When foo is called on an rvalue of type A, then T resolves to A, and hence the argument type becomes A&&.
1 2 3 4 5 6 7 8 9 10
template < typename T > void foo( T&& ) {}
void bar( int&& ) {}
int main()
{
int i = 9 ;
foo(i) ; // fine; foo is a template; T&& collapses to int&
bar(i) ; // *** error: can't bind lvalue to rvalue reference
}