C++中一个名字查找的小知识
最近看C++标准中的3.4 name lookup章节,碰巧的是stackoverflow也有人提问,他们对这个问题很疑惑,回答的也并不好。
https://stackoverflow.com/questions/25672745/friend-declarations-is-this-a-bug-in-clang
其中C++标准中$3.4.1章节有一个例子:
typedef int f;
namespace N {struct A {friend void f(A &);operator int();void g(A a) {int i = f(a);// f is the typedef, not the friend// function: equivalent to int(a)}};
}
标准上的注解的意思是f最终是一个typedef, 不会使用friend void f(A&)这个函数。
我自己的理解是:
- 在类中声明的friend函数在普通查找中,是不可见的,除非在类声明之前有正式的声明,也就是说friend声明不能代替正式的声明,这是标准所规定的。既然是不可见的,就不会hide掉那个typedef的f。标准$3.3.10讲的name hiding在这里不起作用。
- 名字查找要是从普通查找开始的,普通查找就是从内到外一层层地找,找到一个名字,立马停止。在这里找到了f是typedef。普通查找完成后才有ADL查找。
- 因为2找到的是typedef,不是一个函数,所以ADL不会介入。ADL是C++11的新规则。如果函数调用是非限定的,例如不是: 某namespace::f(a), 某class::f(a), object_ptr->f(a), 或者object.f(a)之类的调用,并且参数是用户定义类型,就会发起ADL,它把函数调用中的参数所属的namespace也拉进来找这个函数f。所以ADL介入的条件是要么普通查找找不到这个名字或者找到了而且确实是个函数,那么就把参数所属的namespace也拉进来找,最后凑成一个函数集合,做重载解析规则选出最合适的函数。
在这个例子中如果把typedef int f改成 int f()就会发生ADL。普通查找首先会找到int f(),因为是函数,所以用ADL继续找,找到void f(A&),编译器会说"error: void value not ignored as it ought to be"。
这是由于ADL能找到只声明为friend而没有正式声明的函数,标准就是这么规定。并且void f(A&)比int f()更合适,但是void赋值给 i肯定出错,所以编译器报错啦。
C++中一个名字查找的小知识相关推荐
- react组件中的constructor和super小知识
1.react中用class申明的类一些小知识 如上图:类Child是通过class关键字申明,并且继承于类React. A.Child的类型是? typeof Child === 'fu ...
- Excel中关于日期时间的小知识小技巧,你还记得多少?
点赞再看,养成习惯:星星之火,可以燎原. 微信搜索[亦心Excel]关注这个不一样的自媒体人. 本文 GitHub https://github.com/hugogoos/Excel 已收录,包含Ex ...
- 计算机卸载一个程序正确操作,小知识:为什么电脑卸载一个几G的软件要很久,手机却能瞬间完成...
日常使用手机或电脑,安装卸载软件已成为家常便饭.但是,有木有细心的小伙伴注意过,手机端卸载一个几G的软件通常都是瞬间完成的,而电脑端却要很久的时间,很多时候还不能及时的卸载干净呢?理论上来讲,电脑端的 ...
- pcl中set程序_PCL 常用小知识
时间计算 pcl中计算程序运行时间有很多函数,其中利用控制台的时间计算 首先必须包含头文件#include #include pcl::console::TicToc time; time.tic() ...
- python什么是堆什么是栈_python中堆和栈_Python小知识00002
原博文 2019-05-15 09:48 − 变量位于栈 对象位于堆 ... 0 739 相关推荐 2019-12-03 17:11 − 目录 Python 全栈之路 一. Python 1. Pyt ...
- python中函数的参数_Python小知识-Python中的函数参数(基础篇)
0 总述 这个题目分为2篇,第一篇基本上是概念以及实例,有个相对系统的认识,第二篇想写的深入一些,不同参数类型的区别以及和c/c++的函数参数对比下异同-下面开始是第一篇的内容啦- Python中的函 ...
- 【咬文嚼字】c语言中你可能不知道的小知识
前言 作为一名c语言萌新,在学习完c中的基本语句后,就能写出一些小的c语言程序了,但在写的过程中可能总是会碰到一些小地方困扰着你,因此我决定写下这篇文章记录下我遇到的一些小问题帮助你查漏补缺,并扫清那 ...
- java 取名字_Java入门小知识
软件开发 什么是软件? 一系列按照特定顺序组织的计算机数据和指令的集合 什么是开发? 制作软件 人机交互 软件的出现实现了人与计算机之间的更好的交互 交互方式 图形化界面:这种方式简单直观,使用者易于 ...
- 30+ 个工作中常用到的前端小知识
1. JS为什么单线程 一个简单的原因就是,js在设计之初只是进行一些简单的表单校验,这完全不需要多线程,单线程完全可以胜任这项工作.即便后来前端发展迅速,承载的能力越来越多,也没有发展到非多线程不可 ...
最新文章
- WinXP不能共享Win7的打印机的解决方法
- 《Java程序员,上班那点事儿》目录
- JVM内存占用情况深入分析,分分钟解开你的疑惑
- Luogu P5469 [NOI2019]机器人 (DP、多项式)
- VTK:Points之CompareExtractSurface
- 理解SQL SERVER中的分区表
- 11-直接内存 Direct Memory
- 在 idea 中为类和方法自动生成注释
- fastai学习:05_pet_breeds Questionnaire
- BZOJ 3203 Sdoi2013 保护出题人 凸包+三分
- QT子文件的建立和调用
- Photoshop工作笔记001---Photoshop常用快捷键总结
- python创意实用案例-精心整理!9个 Python 实用案例分享
- 新中大计算机知识,新中大财务软件操作步骤
- TXT文本文件中批量替代回车符号
- win10照片不能下一张的解决办法
- win7旗舰版安装oracle11g
- 大数据专业python实验报告_大数据导论实验报告
- 浪潮服务器系统安装操作,浪潮服务器系统安装操作
- 将文件打成压缩包下载(OSS或FASTDFS)