[Anfängerfrage] Kopierkonstruktor



  • Item foo()
    {
      Item x;
      return x;
    }
    
    main()
    {
      Item x = foo();
    }
    

    Wie wird x (aus der main) initialisiert? Kommt hier der Kopierkonstruktor zum Einsatz oder etwas anderes?

    Falls Kopierkonstruktor:

    std::unique_pointer<Item> foo()
    {
      return std::unique_pointer<new Item>;
    }
    
    main()
    {
      std::unique_pointer<Item> p = foo();
    }
    

    WIeso klappt das dann? Ich dachte unique_pointer kann man nicht kopieren ...?



  • Google Move-Konstruktor.



  • cooky451 schrieb:

    Google Move-Konstruktor.

    Kurz-Erkärung: Mit C++11 gibts auch move-Operationen für r-Values. Ohne diese move-Operationen kann man unique_ptr vergessen. Deine zurückgegebenen Items werden gemoved, wenn denn ein move-ctor vorhanden ist. Das ist dann der Fall, wenn du entweder selber einen definierst oder aber weder move- noch copy-Ctor selber definierst (dann werden beide generiert).



  • Im ersten Bsp. wird je nach Optimierungseinstellung entweder
    1. Standardkonstruktor aufgerufen, dann
    2. Kopierkonstruktor oder Movekonstruktor falls vorhanden

    oder
    1. Nur der Standardkonstruktor augerufen

    oder
    1. garnix passieren

    Im zweiten Bsp. wird, da bei unique_ptr vorhanden der Movekonstruktor (vom unique_ptr) aufgerufen, bzw. auch gar nix, da alles wegoptimiert.



  • --


  • Mod

    brotbernd schrieb:

    Im ersten Bsp. wird je nach Optimierungseinstellung entweder
    1. Standardkonstruktor aufgerufen, dann
    2. Kopierkonstruktor oder Movekonstruktor falls vorhanden

    oder
    1. Nur der Standardkonstruktor augerufen

    oder
    1. garnix passieren

    Im zweiten Bsp. wird, da bei unique_ptr vorhanden der Movekonstruktor (vom unique_ptr) aufgerufen, bzw. auch gar nix, da alles wegoptimiert.

    Der Defaultkonstruktor wird ganz sicher aufgerufen werden (wenn Item eine Klasse ist). Ist der trivial, kann man das aber nat. nicht beobachten.


Anmelden zum Antworten