Tentei corresponder a um genérico Result<&mut T, T>
dentro de um const fn
, mas o compilador não permitiu. Seria necessário remover o valor no final do escopo, o que atualmente não é possível dentro de um const fn
.
Trunquei um pouco meu código e finalmente cheguei a este trecho. Ele continua dando o mesmo erro, pelo mesmo motivo, mas não é mais genérico.
struct Dummy;
impl Drop for Dummy {
fn drop(&mut self) {
println!("dropped");
}
}
const fn const_match(result: Result<Dummy, ()>) -> Result<Dummy, ()> {
match result { //^^^^^^ the destructor for this type cannot be evaluated in constant functions
Ok(ok) => Ok(ok),
Err(err) => Err(err),
}
} // <- value is dropped here
O compilador me dá a seguinte mensagem de erro:
error[E0493]: destructor of `Result<Dummy, ()>` cannot be evaluated at compile-time
--> <source>:9:22
|
9 | const fn const_match(result: Result<Dummy, ()>) -> Result<Dummy, ()> {
| ^^^^^^ the destructor for this type cannot be evaluated in constant functions
...
14 | }
| - value is dropped here
Ao remover const
tudo, a compilação fica perfeita, então criei um teste para verificar se o valor realmente é descartado dentro dessa função.
struct Dummy;
impl Drop for Dummy {
fn drop(&mut self) {
println!("dropped");
}
}
fn const_match(result: Result<Dummy, ()>) -> Result<Dummy, ()> {
match result {
Ok(ok) => Ok(ok),
Err(err) => Err(err),
}
}
fn main() {
let dummy = const_match(Ok(Dummy));
let err = const_match(Err(()));
std::mem::forget(dummy);
}
Aqui está o link do godbolt para um exemplo de código idêntico. Como esperado, ele não produz nenhuma saída, então o destruidor nunca é executado dentro de const_match
.
Por que o destruidor precisa ser capaz de ser executado?