std::stringinsert_foo_at_index_and_return_previous(std::vector<std::string>&list,intindex){//OK, std::vector::operator[] throws if out of rangestd::string&old=list[index];list.insert(index,"foo");// BUG! insert modifie le vecteur et rends les références invalides: crash probablereturnold;}
Rust ne permet pas de faire cette faute car il n'autoriserait pas la référente old d'être valide après un appel vers une fonction non-const du vecteur qui est "emprunté".
Là c'est juste un exemple, mais il y a plein de cas d'erreur qui ne sont pas possible en Rust sans éviter unsafe. Et cela peut devenir assez compliqué. Un autre exemple est la variance: https://doc.rust-lang.org/nomicon/subtyping.html : Le compilateur se charge de s'assurer qu'aucune erreur n'est commise et si tu fait une erreur, le compilateur te le fait savoir. (En pratique, on n'a pas besoin de comprendre cette page sauf si on veux faire code unsafe avec une interface safe.)
[^] # Re: On m'avait dit que c'était impossible alors il l'a fait
Posté par Gof (site web personnel) . En réponse au journal Appel à contribution pour un nouveau langage !. Évalué à 3.
Je vais juste donner un exemple
Rust ne permet pas de faire cette faute car il n'autoriserait pas la référente
oldd'être valide après un appel vers une fonction non-const du vecteur qui est "emprunté".Là c'est juste un exemple, mais il y a plein de cas d'erreur qui ne sont pas possible en Rust sans éviter
unsafe. Et cela peut devenir assez compliqué. Un autre exemple est la variance: https://doc.rust-lang.org/nomicon/subtyping.html : Le compilateur se charge de s'assurer qu'aucune erreur n'est commise et si tu fait une erreur, le compilateur te le fait savoir. (En pratique, on n'a pas besoin de comprendre cette page sauf si on veux faire codeunsafeavec une interface safe.)