Esta resposta é baseada nas respostas do relatório de erros motivadas por esta pergunta .
Cada função no Rust possui seu tipo de item de função individual , que é distinto do tipo de item de função de todas as outras funções. Por esse motivo, uma instância do tipo de item de função não precisa armazenar nenhuma informação - para qual função ela aponta é clara em seu tipo. Então a variável x em
let x = foo;
é uma variável de tamanho 0.
Os tipos de itens de função coagem implicitamente para tipos de ponteiros de função, quando necessário. A variável
let x: fn() = foo;
é um ponteiro genérico para qualquer função com assinatura fn()
e, portanto, precisa armazenar um ponteiro na função para a qual ele realmente aponta; portanto, o tamanho de x
é o tamanho de um ponteiro.
Se você pegar o endereço de uma função, &foo
na verdade, está usando o endereço de um valor temporário de tamanho zero. Antes de este se comprometer com a rust
repo , temporários de tamanho zero usado para criar uma alocação na pilha, e &foo
devolveu o endereço dessa alocação. Desde essa confirmação, os tipos de tamanho zero não criam mais alocações e, em vez disso, usam o endereço mágico 1. Isso explica a diferença entre as diferentes versões do Rust.
foo
já é um ponteiro de função, portanto, você não deve levar um endereço para ele. Isso cria uma referência dupla, aparentemente para um tipo de tamanho zero (portanto, o valor mágico1
).