简介
Microsoft Visual C (MSVC) )经常因其所谓的两阶段模板实例化的有缺陷的实现而受到批评。本文深入探讨了这一批评的具体细节,研究了根本问题并提供了详细的解释。
两阶段模板实例化争议
两阶段模板实例化是 C 中的一个过程,其中首先从语法上检查模板类和函数的正确性,然后在以后的使用站点上进行完整的实例化。然而,有人声称 MSVC 没有正确实现此机制。
对问题的早期理解
最初,人们认为 MSVC 只执行基本的语法检查在模板定义上,忽略模板中使用的名称是否已声明。然而,这种理解并不完整。
问题的本质
MSVC 两阶段模板实例化的实际问题包括两个互连的层:
第 1 层:不正确的第一阶段查找
MSVC 无法对非依赖表达式执行早期(第一阶段)查找,例如示例中:
int foo(void*); template<typename T> struct S { S() { int i = foo(0); } }; void foo(int);
MSVC 将此查找推迟到第二阶段,它错误地将表达式绑定到“foo(int)”,从而导致错误。
图层2:第二阶段查找不正确
MSVC 中模板查找的第二阶段也存在缺陷。虽然 C 标准指定在第二阶段扩展 ADL 命名的命名空间,但 MSVC 也错误地扩展了非 ADL 查找。
这可以通过以下示例进行说明:
namespace N { struct S {}; } void bar(void *) {} template <typename T> void foo(T *t) { bar(t); } void bar(N::S *s) {}
尽管存在依赖性,但对 bar(t) 的调用被错误地解析为 void bar(N::S *s),这表明了 MSVC 第二阶段的不正确行为
结论
Microsoft Visual C 的两阶段模板实例化实现确实有缺陷,但不是最初理解的简单方式。该问题是不正确的第一阶段和第二阶段查找之间复杂的相互作用,可能会导致某些代码结构出现错误或不正确的行为。
以上是Microsoft Visual C 的两阶段模板实例化真的被破坏了吗?如果是,又是如何破坏的?的详细内容。更多信息请关注PHP中文网其他相关文章!