В языке C ++ любое выражение формы some_type()
создает значение типа some_type
.Значение равно значение-инициализировано .
Например, выражение int()
создает значение-инициализированное значение типа int
.Инициализация значения для int
означает нулевую инициализацию, что означает, что int()
оценивается как целое число времени компиляции ноль.
То же самое происходит в вашем примере.Вы создали инициализированное значением значение типа funcptr
.Для типов указателей инициализация значения означает инициализацию с нулевым указателем.
(Обратите также внимание, что совершенно неверно говорить, что выражения типа int()
, double()
или выражения в вашем OP с неТипы классов используют «конструкторы по умолчанию». Типы, не относящиеся к классам, не имеют конструкторов. Концепция инициализация для типов, не относящихся к классам, определяется спецификацией языка без привлечения «конструкторов».)
* 1021Другими словами, вы на самом деле не «играете с указателем на функцию» в вашем примере кода.Вы
создаете нулевое значение указателя на функцию, но больше ничего с ним не делаете, поэтому в коде не возникает никаких проблем.Если бы вы хотели сделать попытку вызова через этот указатель на функцию, она выглядела бы следующим образом
funcptr()()
(обратите внимание на две пары
()
), и этот код, скорее всего, потерпит крах, поскольку именно это обычно происходит, когда кто-то пытается выполнить вызов черезнулевое значение указателя на функцию.