You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++模板成员函数的两种已删除函数声明写法有何区别

解答

结论

你给出的两种已删除的显式特化声明作用完全相同,没有任何语义或运行行为差异,二者是等价写法。

原理说明

你定义的widget_11::process_pointer是单模板参数的函数模板,签名为template<typename T> void process_pointer(T* ptr):

class widget_11 {
public:
    template<typename T>
    void process_pointer(T* ptr)
    {
        std::cout << *ptr;
    }
};

C++标准规定,声明函数模板的显式特化时,如果所有模板实参都可以通过特化的函数参数类型推导得到,允许省略模板实参列表:

  • 第一种写法void widget_11::process_pointer(double*) = delete;没有显式指定模板实参,编译器会根据参数类型double*自动推导出模板参数T = double,最终匹配到的特化实例和第二种写法完全一致
  • 第二种写法void widget_11::process_pointer<double>(double*) = delete;只是把编译器自动推导的结果T = double显式写在了模板实参列表中,属于合法的冗余写法,效果和第一种完全相同

补充说明

只有当模板实参无法从函数签名推导得到时(比如模板参数没有出现在函数参数列表中),才必须显式写出模板实参列表。你当前的测试结果是符合标准定义的,不存在遗漏的特殊场景会导致二者行为不一致。

内容的提问来源于stack exchange,提问作者Michał Turek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 11:12:03