删除函数用法

2020-04-11  本文已影响0人  dhz120

原则:优先使用删除函数,而不是private未定义的函数

删除函数的用法

  1. 删除C++会自动生成的特种成员函数,比如拷贝构造函数和赋值运算符
  2. 删除掉有隐式转换造成的非必要的重载版本
  3. (特有) 阻止那些不应该进行的模板具现

示例

#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
上一篇下一篇

猜你喜欢

热点阅读