Очень специфический угловой корпус, который MSVC запрещает через Compiler Error 2688, является admitted by Microsoft нестандартным поведением. Кто-нибудь знает, почему MSVC++ имеет это конкретное ограничение?Ошибка компилятора MSVC C2688: проблема с корпусом Microsoft C++ ABI?
Тот факт, что он предполагает одновременное использование трех языковых функций («виртуальные базовые классы», «ковариантные типы возврата» и «переменное количество аргументов», в соответствии с описанием на второй связанной странице), которые семантически ортогональны и полностью поддерживается отдельно, похоже, подразумевает, что это не синтаксическая или семантическая проблема, а угловой случай в Microsoft C++ ABI. В частности, тот факт, что участвует «переменное число аргументов», кажется (?), Предполагает, что C++ ABI использует неявный трейлинг-параметр для реализации комбинации двух других функций, но не может, потому что нет фиксированного места поставить этот параметр, когда функция var arg.
У кого-нибудь есть знание ABC Microsoft C++, чтобы убедиться, что это так, и объяснить, для чего используется этот неявный трейлинг-аргумент (или что еще происходит, если мое предположение неверно)? C++ ABI не документирован Microsoft, но я знаю, что некоторые люди за пределами Microsoft выполнили работу, чтобы соответствовать ABI по различным причинам, поэтому я надеюсь, что кто-то сможет объяснить, что происходит.
Кроме того, документация Microsoft является немного непоследовательной; вторая связанная страница говорит:
Виртуальные базовые классы не поддерживаются как ковариантные типы возврата, когда виртуальная функция имеет переменное количество аргументов.
но первая страница в более широком смысле гласит:
общековариантных возвращается с несколько или виртуальное наследование не поддерживается для функций с переменным числом аргументов
Кто-нибудь знает, что реальная история? Я могу сделать некоторые эксперименты, чтобы узнать, но я предполагаю, что фактический угловой случай не является ни одним из них, в точности, но имеет отношение к особенностям класса hierachy таким образом, что документаторы решили замалчивать. Я предполагаю, что это связано с необходимостью корректировки указателя в виртуальном thunk, но я надеюсь, что кто-то с более глубоким знанием ситуации, чем я, может объяснить, что происходит за капотом.