Eu não consigo descobrir isso:
int main() {
int (*) (int *) = 5;
return 0;
}
A atribuição acima é compilada com g ++ c ++ 11. Eu sei que int (*) (int *)
é um ponteiro para uma função que aceita um (int *)
como argumento e retorna um int, mas não entendo como você poderia igualá-lo a 5. No início, pensei que fosse uma função que retornava constantemente 5 (do meu aprendizado recente em F #, provavelmente, haha), então pensei, brevemente, que o ponteiro de função aponta para o local de memória 5, mas isso não funciona, claramente, e nem os valores hexadecimais.
Pensando que poderia ser porque a função retorna um int e que atribuir um int está ok (de alguma forma), eu também tentei isso:
int * (*) (int *) = my_ptr
onde my_ptr
é do tipo int *
, o mesmo tipo deste segundo ponteiro de função, como no primeiro caso com o tipo int. Isso não compila. Atribuir 5 ou qualquer valor int, em vez de my_ptr
, também não compila para este ponteiro de função.
Então, o que significa a atribuição?
Atualização 1
Temos a confirmação de que se trata de um bug, conforme demonstrado na melhor resposta. No entanto, ainda não se sabe o que realmente acontece com o valor que você atribui ao ponteiro de função, ou o que acontece com a atribuição. Quaisquer (boas) explicações sobre isso seriam muito apreciadas! Consulte as edições abaixo para obter mais clareza sobre o problema.
Editar 1
Estou usando o gcc versão 4.8.2 (no Ubuntu 4.8.2)
Editar 2
Na verdade, igualar a qualquer coisa funciona no meu compilador. Mesmo igualando-o a uma variável std :: string, ou um nome de função que retorna um duplo, funciona.
Editar 2.1
Curiosamente, torná-lo um ponteiro de função para qualquer função que retorna um tipo de dados que não seja um ponteiro, permitirá que ele seja compilado, como
std::string (*) () = 5.6;
Mas assim que o ponteiro de função é para uma função que retorna algum ponteiro, ele não compila, como com
some_data_type ** (*) () = any_value;