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 (-)?
Defaulted jest tworzony tylko jeśli wszystkie niestatyczne elementy klasy mają taki konstruktor/operator
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.
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/