重载与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

相关文章

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

Three.js构建一个 3D 商品展示空间完整实战项目

《Three.js构建一个3D商品展示空间完整实战项目》Three.js是一个强大的JavaScript库,专用于在Web浏览器中创建3D图形,:本文主要介绍Three.js构建一个3D商品展... 目录引言项目核心技术1. 项目架构与资源组织2. 多模型切换、交互热点绑定3. 移动端适配与帧率优化4. 可

GO语言短变量声明的实现示例

《GO语言短变量声明的实现示例》在Go语言中,短变量声明是一种简洁的变量声明方式,使用:=运算符,可以自动推断变量类型,下面就来具体介绍一下如何使用,感兴趣的可以了解一下... 目录基本语法功能特点与var的区别适用场景注意事项基本语法variableName := value功能特点1、自动类型推

GO语言中函数命名返回值的使用

《GO语言中函数命名返回值的使用》在Go语言中,函数可以为其返回值指定名称,这被称为命名返回值或命名返回参数,这种特性可以使代码更清晰,特别是在返回多个值时,感兴趣的可以了解一下... 目录基本语法函数命名返回特点代码示例命名特点基本语法func functionName(parameters) (nam

Python Counter 函数使用案例

《PythonCounter函数使用案例》Counter是collections模块中的一个类,专门用于对可迭代对象中的元素进行计数,接下来通过本文给大家介绍PythonCounter函数使用案例... 目录一、Counter函数概述二、基本使用案例(一)列表元素计数(二)字符串字符计数(三)元组计数三、C

python中的显式声明类型参数使用方式

《python中的显式声明类型参数使用方式》文章探讨了Python3.10+版本中类型注解的使用,指出FastAPI官方示例强调显式声明参数类型,通过|操作符替代Union/Optional,可提升代... 目录背景python函数显式声明的类型汇总基本类型集合类型Optional and Union(py

Python中的filter() 函数的工作原理及应用技巧

《Python中的filter()函数的工作原理及应用技巧》Python的filter()函数用于筛选序列元素,返回迭代器,适合函数式编程,相比列表推导式,内存更优,尤其适用于大数据集,结合lamb... 目录前言一、基本概念基本语法二、使用方式1. 使用 lambda 函数2. 使用普通函数3. 使用 N

MySQL中REPLACE函数与语句举例详解

《MySQL中REPLACE函数与语句举例详解》在MySQL中REPLACE函数是一个用于处理字符串的强大工具,它的主要功能是替换字符串中的某些子字符串,:本文主要介绍MySQL中REPLACE函... 目录一、REPLACE()函数语法:参数说明:功能说明:示例:二、REPLACE INTO语句语法:参数

python中update()函数的用法和一些例子

《python中update()函数的用法和一些例子》update()方法是字典对象的方法,用于将一个字典中的键值对更新到另一个字典中,:本文主要介绍python中update()函数的用法和一些... 目录前言用法注意事项示例示例 1: 使用另一个字典来更新示例 2: 使用可迭代对象来更新示例 3: 使用

Python lambda函数(匿名函数)、参数类型与递归全解析

《Pythonlambda函数(匿名函数)、参数类型与递归全解析》本文详解Python中lambda匿名函数、灵活参数类型和递归函数三大进阶特性,分别介绍其定义、应用场景及注意事项,助力编写简洁高效... 目录一、lambda 匿名函数:简洁的单行函数1. lambda 的定义与基本用法2. lambda