In the case of ffc(0)T, it will be output as int, since it 0is an integer literal whose type is int, and there is no real implicit conversion from int to wchar_t * even without forwarding, so the following case won Don't work:
template<typename T>
void ffc_no_forward(T&& a)
{
ff(a);
}
whereas in the first case it 0is a constant of a null pointer and, therefore, is an absolutely valid conversion to wchar_t *.
++ 14 (N4140) section 4.10 Pointer conversion [conv.ptr] , int , prvalue std:: nullptr_t:
(2.14.2) 0 prvalue std:: nullptr_t. ; . . [...]
++ 11 , , , T.C. point std::forward<T>() , .