在 Stack Overflow 的讨论中,出现了关于Microsoft Visual C (MSVC) 两阶段模板实例化的错误实现。此过程涉及初始语法检查,然后是完整的函数/类主体检查。
事实证明,MSVC 仅对模板实体执行基本语法检查。它没有完全验证引用的名称是否至少已声明,从而导致错过潜在的错误。
除了不正确的语法检查之外,两阶段查找过程本身MSVC 面临问题。在第一阶段,依赖表达式(例如函数或成员调用)未完全解析。相反,MSVC 将解决方案推迟到第二阶段。
但是,这种方法的问题在第二阶段变得明显。虽然标准要求在第二个查找阶段只能引入在定义点和实例化点之间添加的声明,但 MSVC 并不遵守此限制。它扩展了普通的非限定查找以包含在第一阶段可见的声明,从而导致潜在的绑定错误和不正确的执行行为。
一个突出显示这些错误的说明性示例在尝试时发生解析模板类 S 中的 foo(0) 表达式。虽然符合标准的编译器会在第一阶段解析此调用并将其绑定到 foo(void*),但 MSVC 会推迟解析并尝试绑定它转换为 foo(int),导致错误。
这种不正确的实现会影响代码功能和开发人员体验。它可能会导致意外错误,并且难以诊断和解决。此外,它还会阻碍代码向其他编译器和平台的可移植性。
Microsoft Visual C 中两阶段模板实例化损坏的问题是一个重大问题,已得到开发商。对于使用 MSVC 的开发人员来说,了解这些问题并采取适当的预防措施以避免意外错误非常重要。
以上是Microsoft Visual C 是否正确实现两阶段模板实例化?的详细内容。更多信息请关注PHP中文网其他相关文章!