首页 > 后端开发 > C++ > 为什么MSVC的两阶段模板实例化偏离C标准?

为什么MSVC的两阶段模板实例化偏离C标准?

Linda Hamilton
发布: 2024-12-24 14:06:15
原创
182 人浏览过

Why Does MSVC's Two-Phase Template Instantiation Deviate from the C   Standard?

Microsoft Visual C 中的两阶段模板实例化:问题是什么?

Microsoft Visual C (MSVC) 因其所谓的两阶段模板实例化的错误实现。此方法由 C 标准定义,由两个不同的阶段组成:

第一阶段:

  • 执行基本语法和类型检查。
  • 不验证内部使用的非依赖名称的声明或存在模板。

第二阶段:

  • 解析非依赖名称并将其绑定到其声明。
  • 扩展命名空间查找对于具有自第一个以来累积的声明的从属名称

MSVC 的缺陷:

MSVC 的主要问题在于它无法对非依赖表达式执行早期(第一阶段)查找。相反,它将所有查找推迟到第二阶段,从而导致不正确的行为。此外,MSVC 的第二阶段未正确遵循非 ADL 查找规范,在此阶段不应扩展该规范。

示例:

考虑以下代码:

符合标准的编译器应该将 'foo(0)' 调用绑定到第一阶段期间的“foo(void*)”。然而,MSVC 在第二阶段错误地将其绑定到 'foo(int)',导致初始化期间出错。

额外的不正确层:

即使在初始化期间第二阶段,MSVC未能遵守标准中不应该扩展非ADL查找的规定。这会导致包含第一阶段不可用的声明,从而导致意外行为。

示例:

此处,'bar(t )' 应该解析为 'void bar(void )',尽管在第二阶段得到了解决。然而,MSVC 错误地将其解析为“void bar(N::S s)”,这表明其实现是错误的。

结论:

MSVC 的两个 -阶段模板实例化实现未能完全遵守 C 标准,导致在处理非依赖表达式和非 ADL 查找时出现不正确的行为。这些缺陷可能会导致意外的编译时错误和程序行为。

以上是为什么MSVC的两阶段模板实例化偏离C标准?的详细内容。更多信息请关注PHP中文网其他相关文章!

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