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
相关产品推荐
相关产品推荐

