Microsoft 承认MSVC 通过编译器错误 2688禁止的一个非常特殊的极端情况是非标准行为。有谁知道为什么 MSVC++ 有这个特定的限制?
它涉及同时使用三种语言特性(“虚拟基类”、“协变返回类型”和“可变数量的参数”,根据第二个链接页面中的描述),这些特性在语义上是正交的,并且分别完全支持似乎暗示这不是解析或语义问题,而是 Microsoft C++ ABI 中的一个极端案例。特别是,涉及“可变数量的参数”这一事实似乎(?)表明 C++ ABI 正在使用隐式尾随参数来实现其他两个特性的组合,但不能因为没有固定的位置当函数为 var arg 时放置该参数。
是否有人对 Microsoft C++ ABI 有足够的了解来确认是否是这种情况,并解释这个隐式尾随参数的用途(或者如果我的猜测不正确,还会发生什么)?微软没有记录 C++ ABI,但我知道微软以外的一些人出于各种原因已经完成了与 ABI 匹配的工作,所以我希望有人能解释发生了什么。
此外,微软的文档有点不一致;链接的第二页说:
当虚函数具有可变数量的参数时,不支持将虚基类作为协变返回类型。
但第一页更广泛地指出:
可变参数函数不支持具有多重或虚拟继承的协变返回
有谁知道真实的故事是什么?我可以做一些实验来找出答案,但我猜测实际的极端情况不是这些,确切地说,而是与类层次结构的细节有关,而文件记录者决定掩饰。我猜它与需要在虚拟 thunk 中进行指针调整有关,但我希望比我更了解情况的人能够解释幕后发生的事情。