【发布时间】:2011-12-07 17:35:00
【问题描述】:
编译器使用两阶段查找来编译模板类是什么意思?
【问题讨论】:
-
@Nawaz 我只听说过两阶段查找,有什么我遗漏的吗?
-
关于这个主题的简短而有用的文章可以在blog.llvm.org/2009/12/dreaded-two-phase-name-lookup.html找到
编译器使用两阶段查找来编译模板类是什么意思?
【问题讨论】:
模板被编译(至少)两次:
如果没有实例化,模板代码本身会检查语法。
例如:任何语法错误,例如; 等。
在实例化时(知道确切类型时),再次检查模板代码以确保所有调用对于该特定类型都是有效的。
例如:模板可能反过来调用该特定类型可能不存在的函数。
这称为两阶段查找。
【讨论】:
sqrt(1),那么在定义模板之前需要声明sqrt。但是如果您调用sqrt(t),其中t 是模板参数类型的实例,那么sqrt 在模板被实例化之前不需要可见。 MSVC 过去没有正确地做到这一点:据我所知,仍然可能不是。
C 从未实例化,则 IOW 给定 template <class T> class C { put really anything here & ~ - (but nothing unbalanced and no 8-bit char outside string literal) } 将被接受!那是十多年前的事了。
::sqrt(::NS::A),因为额外的查找将在::NS 中进行,而不是在:: 中。最后一点是不会搜索别名的范围,typedef 或 using,只会搜索别名类型本身的范围。