Avatar ·

O que significa o ponto de interrogação na restrição de parâmetro de tipo (where T: ?Sized)?

Olá, colegas! Recentemente comecei a estudar Rust e me deparei com uma sintaxe estranha nas restrições de parâmetro de tipo. Vi um código assim: ```rust use std::fmt::Debug; fn print_debug(value: &T) { println!("{:?}", value); } ``` Eu entendo que `T: Debug` é uma restrição que diz que o tipo T deve implementar a trait `Debug`. Mas o que faz o ponto de interrogação antes de `Sized`? Eu sei que `Sized` é uma trait automática para tipos cujo tamanho é conhecido em tempo de compilação. Mas por que podemos escrever `?Sized`? O que isso muda? Tentei remover `?Sized` e escrever apenas `T: Debug`, e o código ainda compilou. Qual é a diferença então? Quando devo usar `?Sized`? E existem outros usos do ponto de interrogação em restrições, além de `?Sized`? Ficarei grato por uma explicação detalhada. Já pesquisei, mas na documentação a explicação parece muito formal. Quero entender com exemplos como isso funciona e por que é necessário.