C++使用two-phase name lookup.在parse模版的时候,第一遍找所有的非dependant-name.而把所有的dependant name留到实例化模版的时候查找。在这个例子中,如果仅仅写'a',那么编译器不认为这是个dependant name,所以就在第一遍parse的时候进行name lookup.但这时候是不考虑模版基类的。所以找不到这个名字。如果加上this->a,那么这就是个dependant name,所以第一遍parse的时候不管它,到实例化的时候再查找。
2-phase name lookup的第2阶段的名字解析,只是进行dependant name 的查找和argument dependant lookup。
Visual C++和老版本的GCC并没有真正的实现2-phase name lookup,而是把模版类里所有的名字查找都留到实例化的时候进行,所以才会接受那样的代码。Clang和新版的GCC是严格执行2-phase name lookup 的。
本文探讨了C++中两阶段名称查找(two-phase name lookup)的概念及其在模板解析过程中的应用。解释了如何区分依赖名称(dependant name)与非依赖名称,并详细说明了现代编译器如Clang和新版GCC如何正确实现这一机制。
915

被折叠的 条评论
为什么被折叠?



