答案:大部分没有区别,都是不能在外部访问这个函数。 区别在于:> 只在使用模板函数时,只能采用delete特化,不能采用private特化。

    如下:
    在模板特例化中,也可以用 delete 来过滤一些特定的形参类型。
    例如,Widget 类中声明了一个模板函数,当进行模板特化时,要求禁止参数为 void* 的函数调用。

    1. class Widget {
    2. public:
    3. template<typename T>
    4. void ProcessPointer(T* ptr) { }
    5. private:
    6. template<>
    7. void ProcessPointer<void>(void*); // error!
    8. };

    问题是,模板特化应该被写在命名空间域 (namespace scope),而不是类域 (class scope),因此,该方法会报错。
    而在 C++11 中,因为有了 delete 关键字,则可以直接在类域外,将特例化的模板函数声明为 delete, 如下所示:

    1. class Widget {
    2. public:
    3. template<typename T>
    4. void ProcessPointer(T* ptr) { }
    5. };
    6. template<>
    7. void Widget::ProcessPointer<void>(void*) = delete ;

    这样,当程序代码中,有调用 void* 作形参的 ProcessPointer 函数时,则编译时就会报错。