Komunikat o błędzie wyraźnie mówi, że domyślny konstruktor został niejawnie usunięty . Mówi nawet dlaczego: klasa zawiera niestatyczną zmienną const, która nie została zainicjowana przez domyślny ctor.
class X {
const int x;
};
Ponieważ X::x
jest const
, musi zostać zainicjowany - ale domyślny ctor normalnie nie zainicjowałby go (ponieważ jest to typ POD). Dlatego, aby uzyskać domyślny ctor, musisz sam go zdefiniować (i musi on zostać zainicjowany x
). Możesz mieć taką samą sytuację z członkiem, który jest odniesieniem:
class X {
whatever &x;
};
Prawdopodobnie warto zauważyć, że oba te elementy również wyłączą niejawne tworzenie operatora przypisania, zasadniczo z tego samego powodu. Niejawny operator przypisania zwykle wykonuje przypisanie składowe, ale w przypadku elementu członkowskiego stałego lub elementu referencyjnego nie może tego zrobić, ponieważ nie można przypisać elementu członkowskiego. Aby przypisanie zadziałało, musisz napisać własny operator przypisania.
Właśnie dlatego element const
członkowski powinien być zwykle statyczny - kiedy wykonujesz przypisanie, i tak nie możesz przypisać stałego członka. W typowym przypadku wszystkie Twoje instancje będą miały tę samą wartość, więc równie dobrze mogą mieć dostęp do pojedynczej zmiennej zamiast mieć wiele kopii zmiennej, która będzie miała tę samą wartość.
Oczywiście możliwe jest jednak tworzenie instancji z różnymi wartościami - na przykład przekazujesz wartość podczas tworzenia obiektu, więc dwa różne obiekty mogą mieć dwie różne wartości. Jeśli jednak spróbujesz zrobić coś takiego jak zamiana ich, stała składowa zachowa swoją oryginalną wartość zamiast być zamieniona.