Que signifie le point d'interrogation dans la contrainte de paramètre de type (where T: ?Sized) ?
Bonjour, collègues ! J'ai récemment commencé à apprendre Rust et je suis tombé sur une syntaxe étrange dans les contraintes de paramètre de type. J'ai vu ce code :
```rust
use std::fmt::Debug;
fn print_debug(value: &T) {
println!("{:?}", value);
}
```
Je comprends que `T: Debug` est une contrainte qui dit que le type T doit implémenter le trait `Debug`. Mais que fait le point d'interrogation devant `Sized` ? Je sais que `Sized` est un trait automatique pour les types dont la taille est connue à la compilation. Mais pourquoi pouvons-nous écrire `?Sized` ? Qu'est-ce que cela change ?
J'ai essayé d'enlever `?Sized` et d'écrire simplement `T: Debug`, et le code s'est quand même compilé. Quelle est alors la différence ? Quand faut-il utiliser `?Sized` ? Et y a-t-il d'autres utilisations du point d'interrogation dans les contraintes, en dehors de `?Sized` ?
Je serais reconnaissant pour une explication détaillée. J'ai déjà cherché sur Google, mais l'explication dans la documentation semble trop formelle. J'aimerais comprendre avec des exemples comment cela fonctionne et pourquoi c'est nécessaire.