Я не могу понять это:
int main() {
int (*) (int *) = 5;
return 0;
}
Вышеприведенное присваивание компилируется с помощью g++ С++ 11. Я знаю, что int (*) (int *)
является указателем на функцию, которая принимает аргумент (int *)
as и возвращает int, но я не понимаю, как вы могли бы приравнять его к 5. Сначала я думал, что это функция, которая постоянно возвращает 5 (из моего недавнего обучения в F #, вероятно, ха-ха), тогда я кратко подумал, что указатель функции указывает на ячейку памяти 5, но это не работает, очевидно, и не имеет шестнадцатеричных значений.
Подумав, что это может быть потому, что функция возвращает int, и что назначение int в порядке (как-то), я также пробовал это:
int * (*) (int *) = my_ptr
где my_ptr
имеет тип int *
, тот же тип, что и этот второй указатель функции, как в первом случае с типом int. Это не компилируется. Назначение 5 или любого значения int вместо my_ptr
не компилируется для этого указателя функции.
Итак, что означает назначение?
Обновление 1
У нас есть подтверждение, что это ошибка, как показано в лучшем ответе. Однако до сих пор неизвестно, что на самом деле происходит со значением, которое вы назначаете указателю функции, или тем, что происходит с назначением. Любые (хорошие) объяснения по этому поводу будут очень оценены! Пожалуйста, ознакомьтесь с приведенными ниже изменениями, чтобы узнать больше о проблеме.
Изменить 1
Я использую gcc версии 4.8.2 (в Ubuntu 4.8.2)
Изменить 2
Собственно, приравнивание к чему-либо работает на моем компиляторе. Даже приравнивая его к переменной std::string или имени функции, которая возвращает double, работает.
Изменить 2.1
Интересно, что это функция указателя на любую функцию, которая возвращает тип данных, который не является указателем, позволит скомпилировать его, например
std::string (*) () = 5.6;
Но как только указатель функции будет работать с функцией, возвращающей некоторый указатель, он не компилируется, например, с помощью
some_data_type ** (*) () = any_value;