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