2013-08-31 3 views
1

Очень специфический угловой корпус, который 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, но я надеюсь, что кто-то с более глубоким знанием ситуации, чем я, может объяснить, что происходит за капотом.

ответ

2

Я могу с уверенностью сказать, что C++ ABI MSVC использует неявные дополнительные параметры для выполнения действий, которые в других ABI (а именно Itanium) реализуют несколько отдельных функций для обработки, поэтому нетрудно представить, что он используется здесь (или было бы, если бы дело было поддержано).

Я не знаю точно, что происходит в этом случае, но представляется правдоподобным, что передается неявный дополнительный параметр, чтобы сообщить thunk о реализации виртуальной функции, требуется ли downcast для класса возвращаемого типа ковариации (или , более вероятно, требуется ли возврат к базовому классу, поскольку фактическая функция реализации, вероятно, возвращает производный класс), и что этот дополнительный параметр прослужит последним, чтобы его можно было игнорировать базовыми классами (которые не знали бы ничего о ковариантном возвращении).

Это означает, что неподдерживаемый угловой случай встречается всегда, когда виртуальный базовый класс является исходным типом возвращаемого типа (так как для производного класса всегда требуется запрос thunk), который является тем, что описано в первой цитате; это также произойдет в некоторых, но не во всех случаях, связанных с множественным наследованием (что может быть, поэтому оно включено во вторую цитату, но не в первую очередь).

Смежные вопросы