• [^] # Re: On m'avait dit que c'était impossible alors il l'a fait

    Posté par (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

    struct Foo {
     std::unique_ptr<struct Bar> child;
    };
    struct Bar {
     std::string name;
     void make_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;
     }
    };
    int main() { 
     auto foo = std::make_shared<Foo>();
     foo->child = std::make_unique<Bar>(Bar{"John"});
     foo->child->make_a_brother(foo);
    }

    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=36583330f87a2f66538290661916da2d

    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)