首页 > 后端开发 > C++ > Microsoft Visual C 的两阶段模板实例化真的被破坏了吗?如果是,又是如何破坏的?

Microsoft Visual C 的两阶段模板实例化真的被破坏了吗?如果是,又是如何破坏的?

Linda Hamilton
发布: 2024-12-07 12:13:10
原创
846 人浏览过

Is Microsoft Visual C  's Two-Phase Template Instantiation Truly Broken, and If So, How?

Microsoft Visual C 被误解的“损坏的”两阶段模板实例化

简介

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板