【问题标题】:Two phase lookup - explanation needed两阶段查找 - 需要解释
【发布时间】:2011-12-07 17:35:00
【问题描述】:

编译器使用两阶段查找来编译模板类是什么意思?

【问题讨论】:

标签: c++ templates


【解决方案1】:

模板被编译(至少)两次:

  1. 如果没有实例化,模板代码本身会检查语法。
    例如:任何语法错误,例如; 等。

  2. 在实例化时(知道确切类型时),再次检查模板代码以确保所有调用对于该特定类型都是有效的。
    例如:模板可能反过来调用该特定类型可能不存在的函数。

这称为两阶段查找。

【讨论】:

  • 另请注意,在第一阶段查找非依赖名称,而在第二阶段查找依赖模板参数的名称。意义在于如果调用sqrt(1),那么在定义模板之前需要声明sqrt。但是如果您调用sqrt(t),其中t 是模板参数类型的实例,那么sqrt 在模板被实例化之前不需要可见。 MSVC 过去没有正确地做到这一点:据我所知,仍然可能不是。
  • 无论如何,这就是为什么它被称为两阶段查找,而不仅仅是两阶段编译之类的。第一阶段应该做的不仅仅是检查语法,但 MS 在实现第一个查找阶段时遇到了一些困难,所以他们只是在实例化时完成了这一切:stackoverflow.com/questions/6273176/…
  • 历史备注:我使用的编译器有一个计数大括号阶段和一个编译阶段,如果 C 从未实例化,则 IOW 给定 template <class T> class C { put really anything here & ~ - (but nothing unbalanced and no 8-bit char outside string literal) } 将被接受!那是十多年前的事了。
  • 对于好奇的人,这是C++ 模板:完整指南的摘录。
  • 除了@SteveJessop 对依赖名称的评论之外,还值得指出的是,它是在依赖名称上发生的“参数依赖查找”。这意味着将找不到::sqrt(::NS::A),因为额外的查找将在::NS 中进行,而不是在:: 中。最后一点是不会搜索别名的范围,typedef 或 using,只会搜索别名类型本身的范围。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-15
  • 1970-01-01
  • 2013-12-10
相关资源
最近更新 更多