Modern Effective C++ Item 11:优先考虑使用deleted函数而非使用未定义的私有声明

news/2024/11/22 22:23:10/
C++98 方法:private

C++98 将特殊成员函数(如拷贝构造函数和拷贝赋值运算符)声明为私有且不定义。这种方法可以防止客户端调用这些函数,但如果在成员函数或友元函数中调用这些函数,会在链接时引发错误。C++11 使用 = delete 将这些函数标记为删除的函数。删除的函数不能以任何方式被调用,即使在成员函数或友元函数中调用也会在编译时失败。这比 C++98 的方法更安全,因为错误在编译阶段就能捕获。删除的函数通常声明为 public 而不是 private。这是因为当客户端代码试图调用成员函数时,编译器会先检查访问性,再检查删除状态。如果函数是 private 的,编译器可能会只报告访问性错误,而不会提到函数已被删除。

template <class charT, class traits = char_traits<charT> >
class basic_ios : public ios_base {
public:…
private:basic_ios(const basic_ios& );           // not definedbasic_ios& operator=(const basic_ios&); // not defined
};
C++11 方法 =delete

使用=delete可以禁止特定类型的函数调用,可以禁止特定类型的模板实例化,类内的模板函数特化,如果类内有一个模板函数,使用 = delete 可以在类外删除特定的模板实例。这是因为在类内不能给特化的成员模板函数指定不同的访问级别,而在类外删除这些函数不会有问题。

template <class charT, class traits = char_traits<charT> >
class basic_ios : public ios_base {
public:basic_ios(const basic_ios& ) = delete;basic_ios& operator=(const basic_ios&) = delete;
};

禁止特定类型的函数调用

bool isLucky(int number);       // 原始版本
bool isLucky(char) = delete;    // 拒绝 char
bool isLucky(bool) = delete;    // 拒绝 bool
bool isLucky(double) = delete;  // 拒绝 float 和 double

禁止特定类型的模板实例化

template<typename T>
void processPointer(T* ptr);
template<>
void processPointer<void>(void*) = delete;
template<>
void processPointer<char>(char*) = delete;
template<>
void processPointer<const void>(const void*) = delete;
template<>
void processPointer<const char>(const char*) = delete;
template<>
void processPointer<const volatile void>(const volatile void*) = delete;
template<>
void processPointer<const volatile char>(const volatile char*) = delete;
template<>
void processPointer<wchar_t>(wchar_t*) = delete;
template<>
void processPointer<char16_t>(char16_t*) = delete;
template<>
void processPointer<char32_t>(char32_t*) = delete;

类内的模板函数特化

class Widget {
public:template<typename T>void processPointer(T* ptr){}
};
template<>
void Widget::processPointer<void>(void*) = delete;


http://www.ppmy.cn/news/1549139.html

相关文章

MongoDB 监控:确保数据库性能和可靠性

MongoDB 监控&#xff1a;确保数据库性能和可靠性 MongoDB 是一个流行的开源 NoSQL 数据库&#xff0c;以其灵活的文档模型和强大的查询语言而闻名。然而&#xff0c;为了确保 MongoDB 的性能和可靠性&#xff0c;监控是至关重要的。本文将讨论 MongoDB 监控的重要性、关键监控…

linux安装TDengine

linux安装TDengine 下载tar.gz安装包&#xff0c;下载地址&#xff1a;使用安装包快速体验 TDengine | TDengine 文档 | 涛思数据 创建TD的安装目录&#xff0c;并将下载好的安装包复制到此目录下。 mkdir /usr/local/tdengine/ 解压安装包 tar -zxvf TDengine-server-3.2.…

[开源] 告别黑苹果!用docker安装MacOS体验苹果系统

没用过苹果电脑的朋友可能会对苹果系统好奇&#xff0c;有人甚至会为了尝鲜MacOS去折腾黑苹果。如果你只是想体验一下MacOS&#xff0c;这里有个更简单更优雅的解决方案&#xff0c;用docker安装MacOS来体验苹果系统。 一、项目简介 项目描述 Docker 容器内的 OSX&#xff08…

labelme格式与yolo格式区别

概述 Labelme格式和YOLO格式是两种用于图像标注的常见格式&#xff0c;主要用于目标检测和图像分割任务。 矩形标注&#xff1a; 矩形标注labelme文件格式&#xff08;json&#xff09;&#xff1a; { {"version": "2024.11.5.0","flags": {}…

实验室管理解决方案:Spring Boot技术

6系统测试 6.1概念和意义 测试的定义&#xff1a;程序测试是为了发现错误而执行程序的过程。测试(Testing)的任务与目的可以描述为&#xff1a; 目的&#xff1a;发现程序的错误&#xff1b; 任务&#xff1a;通过在计算机上执行程序&#xff0c;暴露程序中潜在的错误。 另一个…

「Mac玩转仓颉内测版24」基础篇4 - 浮点类型详解

本篇将详细介绍 Cangjie 中的浮点类型&#xff0c;包括浮点数的表示方法、精度、舍入与溢出处理、科学计数法表示、字面量的进制表示、常用运算、类型转换及应用场景&#xff0c;帮助开发者掌握浮点数的使用方法。 关键词 浮点类型表示精度与舍入溢出与下溢科学计数法类型转换…

智慧社区方案提升居民生活质量与管理效率的创新实践

内容概要 智慧社区方案的背景与发展趋势指向了一个日益重要的方向&#xff0c;随着城市化进程的加快&#xff0c;传统的社区管理模式逐渐显得力不从心。在这个时候&#xff0c;智慧社区应运而生&#xff0c;它通过将现代信息技术与社区管理深度结合&#xff0c;为提升居民生活…

Proxy 实现简易 toy-vue

一、主要功能 实现响应式处理 {{ }}实现 v-model实现 v-bind实现 v-on 二、实现思路 实现响应式 通过使用 Proxy 实现数据劫持 &#xff0c;通过 effect 函数实现数据响应&#xff0c;从而更新页面内容. get 阶段 在 get 中保存当前依赖到 effects 上&#xff0c;由于 eff…