Первое замечание: указатель на функции отличается от указателем на функции-члены .
Ваш первый пример - указатель на обычную функцию. Содержит реальный адрес памяти функции. Когда вы разыменовываете ее ((*_foo)
), вы получаете саму функцию, и арифметические операции, включающие ++
для функции (указатель функции), не имеют смысла.
Второй - другая история, указатели на функции-члены классов не несут адрес функции в памяти. На самом деле то, как компилятор управляет функциями-членами, зависит от реализации. Указатель на функцию-член может содержать некоторый адрес или некоторую информацию, специфичную для компилятора. Арифметика на этот тип также не имеет смысла.
Поэтому мы не знаем, каково значение (a.*ptrFoo)
, но в вашем случае MSVC2008 удалось его скомпилировать, либо из-за ошибки, либо из-за замысла.
Кстати, GCC не компилирует ни одно из двух утверждений и выдает ошибки в обоих.
Вышесказанное верно, независимо от того, положили ли вы четное число +
или нечетное число; мы все равно делаем арифметику. (Если есть нечетное число +
, то вызов функции отсутствует, так как во втором примере вы увеличиваете функцию в 8 раз, тогда как последний оставшийся +
добавляет 10 к результату. Опять же Не имеет значения: мы пытаемся изменить указатель на функцию / член-функцию.)