Прежде всего заметим, что указатель на функции различны с указатель функций членов.
Ваш первый пример - указатель на обычную функцию. Он содержит реальный адрес памяти функции. Когда вы разыгрываете его ((*_foo)
), вы сами получаете функцию, а арифметические операции, включая ++
на функцию (указатель функции), бессмысленны.
Второй - это еще одна история, указатели на функции-члены классов не несут адрес функции в памяти. Фактически, как компилятор управляет функциями-членами, зависит от реализации. Указатель на функцию-член может содержать какой-либо адрес или, возможно, некоторую информацию, относящуюся к компилятору. Арифметика по этому типу также бессмысленна.
Поэтому мы не знаем, что такое значение (a.*ptrFoo)
, но в вашем случае MSVC2008 удалось его компилятор либо из-за ошибки, либо по дизайну.
Кстати, GCC не компилирует ни одно из двух утверждений и не допускает ошибок на обоих.
Вышеупомянутое верно, если вы положили даже число +
или нечетных чисел; мы все равно делаем арифметику. (Если есть нечетное число +
, тогда нет вызова функции, так как в вашем втором примере вы увеличиваете функцию 8 раз, а последний оставшийся +
добавляет к результату 10. При этом это не имеет значения: мы пытаются изменить указатель функции/функции функции.)
'++++++++++++++' - это семь с половиной операторов после инкремента. Предположительно, компилятор попадает на половину. –
Вы скомпилировали его как C и C++? Или почему вы включили оба тега? –
Я скомпилировал его в C++ (VS2008) .i удалит тег «C» – YAHOOOOO