Почему код моего указателя функции работает без ошибок? - PullRequest
4 голосов
/ 30 сентября 2010

У меня есть это:

typedef void (*funcptr) (void);

int main(){

    funcptr(); //this can compile and run with no error . WHAT DOES IT MEAN? WHY NO ERRORS?


}

Ответы [ 3 ]

14 голосов
/ 30 сентября 2010

Оператор создает экземпляр funcptr с помощью конструктора по умолчанию * и удаляет его.

Он похож на код

int main () {
    double();
}

(Примечание: * Технически он выполняет default-initialization , поскольку не все типы имеют конструкторыЭти типы будут возвращать значение по умолчанию ( инициализированные нулями ), например, 0. См. C ++ 98 §5.2.3 / 2 и §8.5 / 5, что на самом деле происходит.)

5 голосов
/ 30 сентября 2010

В языке C ++ любое выражение формы some_type() создает значение типа some_type.Значение равно значение-инициализировано .

Например, выражение int() создает значение-инициализированное значение типа int.Инициализация значения для int означает нулевую инициализацию, что означает, что int() оценивается как целое число времени компиляции ноль.

То же самое происходит в вашем примере.Вы создали инициализированное значением значение типа funcptr.Для типов указателей инициализация значения означает инициализацию с нулевым указателем.

(Обратите также внимание, что совершенно неверно говорить, что выражения типа int(), double() или выражения в вашем OP с неТипы классов используют «конструкторы по умолчанию». Типы, не относящиеся к классам, не имеют конструкторов. Концепция инициализация для типов, не относящихся к классам, определяется спецификацией языка без привлечения «конструкторов».)

* 1021Другими словами, вы на самом деле не «играете с указателем на функцию» в вашем примере кода.Вы создаете нулевое значение указателя на функцию, но больше ничего с ним не делаете, поэтому в коде не возникает никаких проблем.Если бы вы хотели сделать попытку вызова через этот указатель на функцию, она выглядела бы следующим образом funcptr()() (обратите внимание на две пары ()), и этот код, скорее всего, потерпит крах, поскольку именно это обычно происходит, когда кто-то пытается выполнить вызов черезнулевое значение указателя на функцию.
1 голос
/ 30 сентября 2010

Вы определяете тип данных, funcptr, который является функцией, которая не принимает параметров и возвращает void.Затем вы создаете его экземпляр, но без идентификатора отбрасываете его.

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