Почему этот код компилируется? - PullRequest
0 голосов
/ 03 января 2012

У меня есть код.

class A
{
public:
    int foo(int i)
    {
        return i;
    }
};

int foo(int i)
{
    return i;
}

int (A::*ptrFoo)(int) = NULL;
int (*_foo)(int) = NULL;

int  main()
{
    ptrFoo = &A::foo; 
    _foo = foo;

    (*_foo)++++++++++++++(10);   //This dont compile...

    A a;
    (a.*ptrFoo)+++++++++++++++++(10);  //This compiles ????

}

Скажите, пожалуйста, что это такое?неопределенное поведение или что ???Я скомпилировал его в VS2008.Странно, последняя строка кода успешно компилируется.

Ответы [ 2 ]

2 голосов
/ 03 января 2012

Ни одно выражение не должно компилироваться: в C ++ вы не можете выполнять арифметику с указателем на функцию или функцию-член, или на тип функции или функцию-член.Два выражения в вашей программе пытаются выполнить арифметику для функции и функции-члена соответственно.

Если ваш компилятор принимает второе выражение, это происходит из-за ошибки в компиляторе.

1 голос
/ 03 января 2012

Первое замечание: указатель на функции отличается от указателем на функции-члены .

Ваш первый пример - указатель на обычную функцию. Содержит реальный адрес памяти функции. Когда вы разыменовываете ее ((*_foo)), вы получаете саму функцию, и арифметические операции, включающие ++ для функции (указатель функции), не имеют смысла.

Второй - другая история, указатели на функции-члены классов не несут адрес функции в памяти. На самом деле то, как компилятор управляет функциями-членами, зависит от реализации. Указатель на функцию-член может содержать некоторый адрес или некоторую информацию, специфичную для компилятора. Арифметика на этот тип также не имеет смысла.

Поэтому мы не знаем, каково значение (a.*ptrFoo), но в вашем случае MSVC2008 удалось его скомпилировать, либо из-за ошибки, либо из-за замысла.

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

Вышесказанное верно, независимо от того, положили ли вы четное число + или нечетное число; мы все равно делаем арифметику. (Если есть нечетное число +, то вызов функции отсутствует, так как во втором примере вы увеличиваете функцию в 8 раз, тогда как последний оставшийся + добавляет 10 к результату. Опять же Не имеет значения: мы пытаемся изменить указатель на функцию / член-функцию.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...