请问模板特化与指针的引用的关系

请教模板特化与指针的引用的关系
问两个简单的问题,请大神详解原因..

#include <iostream>
#include <cstdlib>
#include <sstream>
#include <cstring>

using namespace std;

//toString
template<typename T> std::string tostr(const T &v)
{
std::stringstream ss;
ss<<v;
return ss.str();


template<> 
std::string tostr<const wchar_t* &>(const wchar_t* &v)
{
std::size_t size=wcslen(v)*2+1;
char* d=new char[size];
    std::wcstombs(d,v,size);
return d;


int main()
{
//用以支持宽字符显示
std::ios::sync_with_stdio(false);  // Linux gcc.
    std::locale::global(std::locale(""));
    std::setlocale(LC_CTYPE, "");    // MinGW gcc.
    std::wcout.imbue(std::locale(""));

const wchar_t *c=L"天天ad";
cout<<tostr(c)<<endl;//不能识别特化
cout<<tostr<const wchar_t* &>(c)<<endl;//显式指定特化
}

1.为什么tostr(c)不能识别特化版本?
2.为什么特化时一定要加&,模板定义时形参已经包含了&("const T &v"),但是在特化时不加&,直接写wchar_t*是报错的?

------解决方案--------------------
因为模板特化是不考虑类型转换的,静态类型识别是精确匹配的。
------解决方案--------------------
下面这段代码有问题:
template<> 
std::string tostr<const wchar_t* &>(const wchar_t* &v)
{
    std::size_t size=wcslen(v)*2+1;
    char* d=new char[size];
       std::wcstombs(d,v,size);
    return d;

请考虑d如何释放。
------解决方案--------------------
楼主现在还有困惑吗?
关于C++的模板编程在《C++标准程式库》中有很多,里面也有const和非const的例子,希望对你有用。