• [^] # Re: Premières impressions

    Posté par . En réponse à la dépêche Rust 1.0, entrée dans la période stable. Évalué à 9.

    Ça existe aussi en C++, depuis C++03 avec auto_ptr (mais qui était une catastrophe), et correctement depuis C++11 avec la sémantique de mouvement / unique_ptr.

    Ça existe, oui et non...
    La différence entre ça

    #include <iostream>
    #include <memory>
    static void foo(std::unique_ptr<int> ptr)
    {
     std::cout << *ptr << '\n';
    }
    int main()
    {
     std::unique_ptr<int> ptr(new int(42));
     foo(std::move(ptr));
     // OUPS!!!
     foo(std::move(ptr));
    }

    et ça

    fn foo(n: Box<i32>) {
     println!("{}", n);
    }
    fn main() {
     let n = Box::new(42);
     foo(n);
     // OUPS!!!
     foo(n);
    }

    C’est ça

    42
    zsh: segmentation fault (core dumped) ./oups
    

    contre ça :

    oups2.rs:8:10: 8:11 error: use of moved value: `n`
    oups2.rs:8 take(n);
     ^
    oups2.rs:7:10: 7:11 note: `n` moved here because it has type `Box<i32>`, which is non-copyable
    oups2.rs:7 take(n);
     ^
    error: aborting due to previous error
    

    Dans un cas ça pète à la compilation (donc catastrophe évitée) dans l’autre ça pète à l’exécution (segmentation fault, youhou...).
    Donc oui y’a des trucs qui ressemble à ça en C++ mais c’est pas équivalent.