重载与using声明,命名空间隐藏规则的例外,非模板和模板函数重载

2024-06-16 23:48

本文主要是介绍重载与using声明,命名空间隐藏规则的例外,非模板和模板函数重载,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

知识点:

1,重载与using声明(P708)

一个using声明引入的函数将重载该声明语句所属作用域中已有的其他同名函数。

(1)如果using声明出现在局部作用域,则引入的名字将隐藏外层作用域的相关声明。

(2)如果using声明所在的作用域中已经有一个函数与新引入的函数同名且参数列表相同,则该using声明将引发错误(f. using指示)。

(3)除了(1)(2),using声明将为引入的名字添加额外的重载实例,并最终扩充候选函数集的规模。

2,命名空间隐藏规则的例外---实参相关的查找与类类型形参(P706)

对于命名空间中名字隐藏规则有一个重要例外:当我们给函数传递一个类类型的对象时,除了在常规作用域查找外,还会查找实参类所属的命名空间。这一例外对于传递类的引用或指针的调用同样有效。

3,非模板和模板重载(P616)

当存在多个同样好的函数模板时,编译器选择最特例化的版本,处于同样的原因,一个非模板函数比一个函数模板更好。

 

从一个资源管理的类设计说起,涵盖这三个知识点:

资源管理的类通常会定义类自己的swap函数:

class HasPtr {friend void swap(HasPtr&, HasPtr&);string *ps;int i;
};
// A
inline void swap(HasPtr &lhs, HasPtr &rhs)
{using std::swap();swap(lhs.ps, rhs.ps); // HasPtr中ps是内置指针, 因此这里调用的是std::swap()swap(lhs.i, rhs.i); // HasPtr中i是内置int, 因此这里调用的是std::swap()
}class Foo {...friend void swap(Foo&, Foo&);Hasptr h;
}// B
void swap(Foo &lhs, Foo &rhs)
{std::swap(lhs.h, rhs.h); // 效率低下
}
// C
void swap(Foo &lhs, Foo &rhs)
{using std::swap();swap(lhs.h, rhs.h); // 会调用HasPtr的swap()
}

对于Foo的swap应该设计成C这种,交换Foo数据成员h时的调用swap是调用的HasPtr的swap(),原因:

1,局部作用域中没有其他swap()函数声明,这里的using std::swap()声明会隐藏外层作用域相关swap()相关函数。(P709)

2,根据知识点2-命名空间隐藏规则的例外,知道局部作用域内有两个可选swap(),一个是std::swap()(模板函数),一个是HasPtr类定义的swap()(非模板函数)。这也是为什么A中swap内部调用的swap是std::swap,因为内置类型没有特定版本的swap,所以局部作用域内只有std::swap版本的swap,因此调用的是std::swap。

3,根据知识点3-非模板和模板函数重载,选则的是HasPtr类定义的swap()(非模板函数)

 

这篇关于重载与using声明,命名空间隐藏规则的例外,非模板和模板函数重载的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1067902

相关文章

Kotlin 作用域函数apply、let、run、with、also使用指南

《Kotlin作用域函数apply、let、run、with、also使用指南》在Kotlin开发中,作用域函数(ScopeFunctions)是一组能让代码更简洁、更函数式的高阶函数,本文将... 目录一、引言:为什么需要作用域函数?二、作用域函China编程数详解1. apply:对象配置的 “流式构建器”最

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

C++中::SHCreateDirectoryEx函数使用方法

《C++中::SHCreateDirectoryEx函数使用方法》::SHCreateDirectoryEx用于创建多级目录,类似于mkdir-p命令,本文主要介绍了C++中::SHCreateDir... 目录1. 函数原型与依赖项2. 基本使用示例示例 1:创建单层目录示例 2:创建多级目录3. 关键注

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程

kotlin的函数forEach示例详解

《kotlin的函数forEach示例详解》在Kotlin中,forEach是一个高阶函数,用于遍历集合中的每个元素并对其执行指定的操作,它的核心特点是简洁、函数式,适用于需要遍历集合且无需返回值的场... 目录一、基本用法1️⃣ 遍历集合2️⃣ 遍历数组3️⃣ 遍历 Map二、与 for 循环的区别三、高

查看Oracle数据库中UNDO表空间的使用情况(最新推荐)

《查看Oracle数据库中UNDO表空间的使用情况(最新推荐)》Oracle数据库中查看UNDO表空间使用情况的4种方法:DBA_TABLESPACES和DBA_DATA_FILES提供基本信息,V$... 目录1. 通过 DBjavascriptA_TABLESPACES 和 DBA_DATA_FILES

Pytorch微调BERT实现命名实体识别

《Pytorch微调BERT实现命名实体识别》命名实体识别(NER)是自然语言处理(NLP)中的一项关键任务,它涉及识别和分类文本中的关键实体,BERT是一种强大的语言表示模型,在各种NLP任务中显著... 目录环境准备加载预训练BERT模型准备数据集标记与对齐微调 BERT最后总结环境准备在继续之前,确

Linux命名管道方式

《Linux命名管道方式》:本文主要介绍Linux命名管道方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、命名管道1、与匿名管道的关系2、工作原理3、系统调用接口4、实现两个进程间通信二、可变参数列表总结一、命名管道1、与匿名管道的关系命名管道由mkf

C语言字符函数和字符串函数示例详解

《C语言字符函数和字符串函数示例详解》本文详细介绍了C语言中字符分类函数、字符转换函数及字符串操作函数的使用方法,并通过示例代码展示了如何实现这些功能,通过这些内容,读者可以深入理解并掌握C语言中的字... 目录一、字符分类函数二、字符转换函数三、strlen的使用和模拟实现3.1strlen函数3.2st

MySQL中COALESCE函数示例详解

《MySQL中COALESCE函数示例详解》COALESCE是一个功能强大且常用的SQL函数,主要用来处理NULL值和实现灵活的值选择策略,能够使查询逻辑更清晰、简洁,:本文主要介绍MySQL中C... 目录语法示例1. 替换 NULL 值2. 用于字段默认值3. 多列优先级4. 结合聚合函数注意事项总结C