Chcę uniemożliwić użytkownikowi mojej klasy z użyciem go jako zmienną automatyczną, więc piszę kod tak:Jaka jest różnica między "= domyślnym" destruktorem i pustym destruktorem?
class A {
private:
~A() = default;
};
int main() {
A a;
}
Spodziewam się, że kod nie zostanie skompilowany, ale g ++ kompiluje bez błędów .
Jednak, kiedy zmienić kod do:
class A {
private:
~A(){}
};
int main() {
A a;
}
Teraz, g ++ daje błąd że ~A()
jest prywatny, jak jest moje oczekiwanie.
Jaka jest różnica między "= domyślnym" destruktorem a pustym destruktorem?
Jaką wersję gcc? –
Czytanie np. [to odwołanie do destruktora] (http://en.cppreference.com/w/cpp/language/destructor), różnica polega na tym, że dostarczony przez użytkownika destruktor (nawet jeśli jest pusty) jest * nietrywialny * i od reference: "Obiekty z trywialnymi destruktorami nie wymagają wyrażenia delete i można je usunąć, po prostu rozdzielając ich pamięć." –
W twoim przypadku nie ma różnicy, zarówno [gcc4.9, jak i clang3.5 odmawiają kompilacji] (http://coliru.stacked-crooked.com/a/41976bc03bc12c79) Twój pierwszy przykład. To musi być błąd w twojej wersji gcc. – Praetorian