MSVC通过Compiler Error 2688禁止的非常特殊的角落案例是admitted by Microsoft是非标准行为。有谁知道为什么MSVC++有这个特定的限制?MSVC编译器错误C2688:Microsoft C++ ABI转角案例问题?
事实上,它涉及语义正交(根据第二个链接页面中的描述)同时使用三种语言特征(“虚拟基类”,“协变返回类型”和“可变参数数量”)并单独提供完全支持似乎意味着这不是解析或语义问题,而是Microsoft C++ ABI中的一个角落案例。特别是,涉及“可变数量的参数”的事实似乎(?)表明C++ ABI正在使用隐式拖尾参数来实现其他两个特征的组合,但不能因为没有固定的位置当函数是var arg时放置该参数。
有没有人有足够的Microsoft C++ ABI知识来确认是否是这种情况,并解释这个隐含的结尾参数用于什么(或者还有什么事情发生,如果我的猜测不正确)? C++ ABI没有被微软记录下来,但我知道微软以外的一些人为了与各种原因匹配ABI而做了很多工作,所以我希望有人能够解释发生了什么。
此外,微软的文档有点不一致;链接的第二页说:
虚拟函数具有可变数量的参数时,虚拟基类不支持作为协变返回类型。
,但在第一页更广泛地说:
与多个或虚继承协变的回报不支持可变参数的函数
有谁知道真正的故事是什么?我可以做一些实验来发现,但我猜测实际的角落案例既不是这些,也不是确切的,而是与文档人员决定遮盖的类层次的细节有关。我的猜测是,它需要在虚拟thunk中进行指针调整,但我希望能够比我更深入地了解情况的人可以解释背后的情况。