C++的两阶段名称查找为什么
Two phase name lookup for C++ Why?
为什么C++标准定义了模板的两阶段查找?难道非依赖声明和定义的查找也不能推迟到实例化阶段吗?
他们可以。这是大多数早期模板实现的方式工作,并且仍然是微软编译器的工作方式。感觉到了(在委员会中)这太容易出错;它让它变得太容易了意外劫持了一个名称,在一个翻译中实例化单元拾取本地名称,而不是所需的全局符号。(A典型的翻译单元将由CCD_ 1s的序列组成,声明每个人都应该看到的名称,然后是实现密码在实例化时实例化是可见的,包括实现代码。)
最后的决定是将模板中的符号分为两类类别:依赖和非依赖,并坚持在模板,以降低它们意外绑定到某些本地实现符号。结合规定的要求typename
和template
,当适用于从属符号时还允许在定义时进行解析和一些错误检查而不是仅当模板被实例化时。
这可以被视为关注点分离的应用。
在第一阶段,它只是检查正确的语法,并解析非依赖名称,如本文所述。在第二阶段,它会做一些更特定于模板的事情,验证特定类型的调用是否有效。见此[答案](两相查找-需要解释)
此外,如果它只在一个阶段完成,那么它应该在每个实例化中完成。这种方式只进行一次。
如果只在第一个实例化时进行,那么它将是相同的,只是结构不那么结构化。
相关文章:
- 为什么使用数组元素查找最大数字的程序不起作用?
- 代码以查找数组中的最大数字,但它仅将第一个数字显示为最大数字. 有人请告诉我为什么
- 为什么 C++ 编译器在"c:program filesgnu emacsinclude"中查找包含文件?
- 模板库中的名称查找:为什么我们要添加这个>
- 我正在努力在随机数组中查找最小值,有人知道为什么我的代码不起作用?C++
- 为什么在查找元素时需要使用 set.find(x) != set.end()
- 为什么我的阶乘数查找器返回以C++输入的数字?(已编辑)
- 为什么我的 Rcpp 实现查找唯一项的数量比基本 R 慢?
- 为什么查找 + 插入的组合比单个插入语句工作得更快
- 为什么名称查找在找到使用 using 指令隐式声明的实体时不停止?
- 为什么在其他函数中声明的函数不参与参数相关查找?
- 为什么 POSIX 允许在现有文件末尾 (fseek) 之外查找只读模式
- 为什么在这种情况下不考虑依赖于参数的查找?
- 为什么当代码尝试在 STL 映射中查找键时出现分段错误
- C 与查找功能一起使用时,迭代器为什么行为会有所不同
- 查找最大的无符号 int ....为什么这不起作用?
- 为什么两阶段查找无法选择"交换"的重载版本?
- 为什么在语句"std::cout << std::endl;"中使用时需要命名空间限定,给定依赖于参数的查找?
- C++的两阶段名称查找为什么
- 为什么 g++ 在 LIBRARY_PATH/./lib64 中查找,以及它在哪里记录