2013-11-26 9 views
0

Сегодня я узнал, что указатели на функции и указатели данных не совпадают и поэтому несовместимы друг с другом (Why are function pointers and data pointers incompatible in C/C++?). Мой вопрос, однако, заключается в том, что разные функции (не членские) указатели совместимы друг с другом (реализованы одинаково).Разные функциональные указатели совместимы друг с другом?

В коде:

typedef void(*FuncPtr0)(); 
typedef void(*FuncPtr1)(int); 

FuncPtr0 p0; 
FuncPtr1 p1; 

p0 = reinterpret_cast<FuncPtr0>(p1); // will this always work, if p1 really 
p0();         // points to a function of type FuncPtr0 

Спасибо за вашу помощь!

ответ

9

n3376 5.2.10/6

Функция указатель может быть явно преобразован в указатель на функцию другого типа. Эффект вызова функции с помощью указателя на тип функции (8.3.5), который не совпадает с типом, используемым в определении функции, не определен. За исключением того, что преобразование prvalue типа «указатель на T1» в тип «указатель на T2» (где T1 и T2 - это типы функций) и обратно к его исходному типу дает исходное значение указателя, результатом такого преобразования указателя является неопределенные.

+0

спасибо! Кажется, было довольно легко найти ответ на этот вопрос. Могу я спросить вас, как вы решили найти цитату в стандарте? – rozina

+0

@rozina просто посмотрите на параграф, расскажите о reinterpret_cast. – ForEveR

+0

Я googled и узнал, что стандарт не является бесплатным, что объясняет, почему ни один из результатов поиска Google никогда не показывает стандартные только кавычки здесь в stackoverflow :) Еще раз спасибо! – rozina

1

Нет, они не совместимы и будут ссылаться undefined поведение. У вас будут неуказанные результаты.

Фактически вы можете передавать их друг другу, но вы не должны вызывать указатель функции, который указывает на несовместимую сигнатуру функции. Например, см this code:

typedef void(*FuncPtr0)(); 

void p1f()  { std::cout << "ONE";  } 
void p2f(int x) { std::cout << "TWO " << x ; } 

int main() 
{ 
    FuncPtr0 p0 = reinterpret_cast<FuncPtr0>(p2f); 
    p0(); 
} 

Выход

TWO 1 

Вопрос заключается в том, кто установлен аргумент x в 1? Он может работать, но результат не указан. В моей системе результат - это что-то еще (мусор) TWO 39.

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