Jakie metody są domyślnie tworzone dla klasy zawierającej unique_ptr jako data member?

0

Hej
Np. jak zadeklarujesz destruktor to nie utworzy ci się domyślnie konstruktor przenoszący i przenoszący operator przypisania, utworzy ci się domyślnie tylko kopiujący operator przypisania i kopiujący konstruktor. (-)
Jak nie masz unique_ptr tylko jakieś typy w stylu int jako składowe klasy to domyślnie kompilator ci utworzy wszystko.
A co jak mam unique_ptr ktory nie ma kopiującego operatora przypisania i kopiującego konstruktora? Wtedy domyślnie dla klasy nic sie nie utworzy czy utworzy się to co tutaj (-)?

3

Defaulted jest tworzony tylko jeśli wszystkie niestatyczne elementy klasy mają taki konstruktor/operator

0

Jeszcze taki ciekawy przykład:

#include <iostream>
#include <memory>

using namespace std;

class Klasa
{
  public:
  Klasa() = default;
  Klasa(const Klasa& x) = delete;
  Klasa(Klasa& x) = delete;
  public:
  unique_ptr<int> ptr;
};

class Klasa2
{
    public:
     Klasa2() = default;
     Klasa2(const Klasa2& x) = default;
     Klasa2(Klasa2& x) = default;
    public:
    Klasa klasa;
};

int main()
{
    Klasa2 klasa2;
    klasa2.klasa.ptr = std::make_unique<int>(7);
    std::cout << *klasa2.klasa.ptr << std::endl;
    Klasa2 klasa2kopia(klasa2);

    return 0;
}

Dopóki w funkcji main nie napisałem "Klasa2 klasa2kopia(klasa2);" to się program budował i wykonywał. Jak napisałem to to się nie kompiluje, wyrzuca błąd że Klasa nie ma kontruktora przenoszącego i kopiującego. Zastanawia mnie czemu dopiero program się wywala po dopisaniu tej linijki a nie wcześniej, przecież wcześniej też powinien się wywalić na tworzeniu przez kompilator domyślnego konstruktora przenoszącego/kopiującego. Chyba że może wtedy nie tworzy bo robi optymalizację, że taki konstruktor jest nieużywany w mainie() więc niepotrzebny. Czyli to że ja dam :

Klasa2(const Klasa2& x) = default;
     Klasa2(Klasa2& x) = default;

nie jest gwarantem tego że kompilator na pewno mi utworzy takie ctory.

7

Co prawda @kq podał już pełną odpowiedź ale dodam tylko, że istnieje fajne clangowe narzędzie, które potrafi "pokazać" co kompilator wyczaruje z naszego kodu, min. można tam zobaczyć właśnie jakie funkcje zostaną automatycznie wygenerowane dla klasy. https://cppinsights.io/

1 użytkowników online, w tym zalogowanych: 0, gości: 1