C ++ указатель на функцию vararg - PullRequest
1 голос
/ 13 октября 2011

Приводит ли следующее к четко определенному поведению?То есть, если вы приведете не vararg-функцию f в качестве функции vararg g и вызовете g с аргументами, которые ожидает f, соответствует ли поведение вызова f с этими аргументами?* ОБНОВЛЕНИЕ

Есть ли какой-нибудь способ, которым я могу получить четкое определение программы, даже если использовать проприетарные ключевые слова?Например, что-то вроде __cdecl, упомянутое здесь:

http://msdn.microsoft.com/en-us/library/984x0h58%28v=vs.80%29.aspx

Моя конечная цель - иметь функцию matcher, которая пытается сопоставить список X-указателей.Функция matcher принимает предикат (не обязательно функция ... может быть списком) и принимает функцию, в которую она передает сопоставленные результаты.Функция обратного вызова, переданная ей, принимает те же типы аргументов и арность, что и предикат.

Ответы [ 2 ]

6 голосов
/ 13 октября 2011

Нет, поведение не определено для C ++ 11 5.2.11 / 6 (reinterpret_cast):

Эффект вызова функции через указатель на тип функции, которыйне совпадает с типом, используемым в определении функции, не определено.

Тип bar равен int(Derived1*, Derived2*).Тип функции, на которую указывает f (выражение, посредством которого выполняется вызов), равен int(...).Они не одинаковы, поэтому их поведение не определено.

2 голосов
/ 13 октября 2011

Я почти уверен, что ответ «Нет».

Например, в Visual C ++ для функции с переменными числами соглашение о вызовах будет отличаться от обычного (при использовании /Gz).

Соглашение о вызовах определяет, какой код сборки перед вызовом и после вызова генерируется, и вы не можете безопасно смешать их.

...