std::vector est en quelque sorte un smart pointer, et il me semble que les référence ne sont pas considéré comme "dumb", même en C++ moderne.
Mais bon, voici un autre exemple un peu plus compliqué avec que des smart pointers
structFoo{std::unique_ptr<structBar>child;};structBar{std::stringname;voidmake_a_brother(std::shared_ptr<Foo>some_foo){some_foo->child=std::make_unique<Bar>(Bar{"brother of "+name});// Oups, la ligne précédente peut faire un `delete this` si `some_foo->child == this` std::cout<<name<<" now has a brother"<<std::endl;}};intmain(){autofoo=std::make_shared<Foo>();foo->child=std::make_unique<Bar>(Bar{"John"});foo->child->make_a_brother(foo);}
Edit: Note: le programme en Rust n'est pas très idiomatique car on utiliserait probablement plutôt des référence mutable à la place de Rc<RefCell> mais je voulais juste faire une traduction 1:1 du code en C++ (qui lui même est un peu bizarre à cause de la contrainte de ne pas pouvoir utilisé de pointeur ou références)
[^] # 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é à 5. Dernière modification le 25 mars 2021 à 15:22.
std::vector est en quelque sorte un smart pointer, et il me semble que les référence ne sont pas considéré comme "dumb", même en C++ moderne.
Mais bon, voici un autre exemple un peu plus compliqué avec que des smart pointers
Le programme équivalent en Rust compile, mais panic au runtime (
panicked at 'already borrowed: BorrowMutError', src/main.rs:14) au lieu de faire un use-after-free https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=36583330f87a2f66538290661916da2dEdit: Note: le programme en Rust n'est pas très idiomatique car on utiliserait probablement plutôt des référence mutable à la place de
Rc<RefCell>mais je voulais juste faire une traduction 1:1 du code en C++ (qui lui même est un peu bizarre à cause de la contrainte de ne pas pouvoir utilisé de pointeur ou références)