原则:优先使用删除函数,而不是private未定义的函数
删除函数的用法
- 删除C++会自动生成的特种成员函数,比如拷贝构造函数和赋值运算符
- 删除掉有隐式转换造成的非必要的重载版本
-
(特有) 阻止那些不应该进行的模板具现
示例
#ifndef DELFUNCDEMO_H
#define DELFUNCDEMO_H
// 原则:优先使用删除函数,而不是private未定义的函数
// 删除函数的用法
// 1. 删除C++会自动生成的特种成员函数
// 2. 删除掉有隐式转换造成的非必要的重载版本
// 3. 特有:阻止那些不应该进行的模板具现
namespace T14_NS {
class D1 {
public:
// 使用默认构造,及系统自己生成的那个
D1() = default;
// 删除拷贝构造函数和赋值函数,使D1无法拷贝
// 注意:不用改为private, 因为c++会先校验可访问性,再校验删除状态
D1(const D1 &) = delete;
D1& operator=(const D1 &) = delete;
public:
void lucky(int) {} // 原始版本
void lucky(double) = delete; // 明确拒绝double和float类型, 即不想要double->int的隐式转换
};
template <typename T>
void processPoint(T *) {} // 通用模板,用来处理指针
template <>
void processPoint<void>(void *) = delete; // 阻止void*指针,即不支持这种类型
template <>
void processPoint<char>(char *) = delete; // 阻止char *指针,即不支持这种类型
void test()
{
D1 d;
// 编译报错
//d = D1();
d.lucky(1); // ok
// 隐式转换 double->int
//d.lucky(1.1); // 编译报错
processPoint(&d); // ok
//processPoint((void *)&d); // 编译报错, 不允许传入void*指针
char p[] = "hello";
//processPoint(p); // 编译报错, 不允许传入char*指针
}
} // T14_NS
#endif // DELFUNCDEMO_H
网友评论